public class LinkListTest {
/**
* we deal with two main missions:
*
* A.
* 1.we create two joined-List(both have no loop)
* 2.whether list1 and list2 join
* 3.print the joinPoint
*
* B.
* 1.create loop in list1 by itself
* 2.whether the list has loop
* 3.print the firstNode of loop
*/
public static void main(String[] args) {
MyLinkList list1=new MyLinkList();
int[] a={1,2,3,4,5,6,7,8,9,10};
ListNode head1=list1.create(a);
System.out.print("List1=");
list1.display();
MyLinkList list2=new MyLinkList();
int[] b={11,12};
ListNode head2=list2.create(b);
ListNode joinPoint=list1.getNodeAt(3);
ListNode tail02=list2.getTail();
tail02.next=joinPoint;
//now list2=11->12->3->4->5 ->6->7->8->9-> 10
System.out.print("List2=");
list2.display();
LinkListTest.isJoined(head1,head2);
//create a loop to find the join-point
tail02=list2.getTail();
tail02.next=head2;
ListNode firsrNodeInLoop=list1.getFirstNodeInLoop(head1);
System.out.println("The two joinedLink's joinPoint is "+firsrNodeInLoop.data);
//delete the loop
tail02.next=null;
list1.setLoop(5);//create a loop like following:
/*now list1=
________________
/ |
1->2->3->4->5 ->6->7->8->9-> 10
*/
ListNode meetingPoint=list1.hasLoop(head1);
if(meetingPoint!=null){
System.out.println("Now List1 hasLoop,lowPoint&&fastPoint meets at "+meetingPoint.data);
firsrNodeInLoop=list1.getFirstNodeInLoop(head1);
System.out.println("firstNode of Loop is "+firsrNodeInLoop.data);
}
}
//whether list1 and list2 join
static void isJoined(ListNode head1,ListNode head2){
while(head1.next!=null){
head1=head1.next;
}
while(head2.next!=null){
head2=head2.next;
}
if(head1==head2){
System.out.println("joined");
}else{
System.out.println("not joined");
}
}
}
class MyLinkList{
private ListNode head;
//建立单链表有两种方法:头插法建表和尾插法,后者需多建立一个尾指针
//这里我用头插法
public ListNode create(int[] a){
ListNode firstNode=null;
//starts with the last element
for(int i=a.length-1;i>=0;i--){
ListNode node=new ListNode(a[i]);
node.next=firstNode;
firstNode=node;
}
head=firstNode;
return firstNode;
}
//if hasLoop,return the "Meeting-point".
public ListNode hasLoop(ListNode head){
ListNode p1=head;
ListNode p2=head;
while(p2!=null&&p2.next!=null){
p1=p1.next;
p2=p2.next.next;
if(p1==p2){
return p1;
}
}
return null;
}
//display LinkList's elements while it has no loop
public void display(){
ListNode p=head;
while(p!=null){
System.out.print(p.data+",");
p=p.next;
}
System.out.println();
}
//get the a[position]
public ListNode getNodeAt(int position){
ListNode node=head;
while(--position>0){
node=node.next;
}
return node;
}
//create a loop. Make tail's nextElement is a[i]
public void setLoop(int i){
ListNode p=head;
while(p!=null&&p.next!=null){
p=p.next;
}
ListNode loopPoint=getNodeAt(i);
p.next=loopPoint;
}
//p1 traverse from head while p2 from "Meeting-point".When they meets,it's the firstNode of loop
public ListNode getFirstNodeInLoop(ListNode head){
ListNode re=null;
ListNode p1=head;
ListNode p2=hasLoop(head);
if(p2!=null){
while(true){
p2=p2.next;
p1=p1.next;
if(p1==p2){
re=p1;
break;
}
}
}
return re;
}
//get the last node of LinkList
public ListNode getTail(){
ListNode p=head;
while(p.next!=null){
p=p.next;
}
return p;
}
public ListNode getHead() {
return head;
}
public void clear(){
head=null;
}
}
class ListNode{
int data;
ListNode next;
public ListNode(int data){
this.data=data;
}
}
分享到:
相关推荐
### 编程判断两个链表是否相交 在计算机科学中,链表是一种常见的数据结构,广泛应用于多种算法实现和实际应用中。本篇文章将详细探讨如何判断两个单向链表是否相交的问题,以及相应的解决方案。 #### 问题背景 在...
### 编程判断两个链表是否相交 #### 背景介绍 在软件开发过程中,数据结构的应用极为广泛,其中链表作为一种基础且重要的数据结构,在很多场景下都有着不可替代的作用。对于链表而言,了解其是否与其他链表相交是...
该方法通过将h1链表的尾节点的next指针指向h2链表的头节点,如果两个链表相交,此时h2会形成一个循环链表。接下来只需判断h2是否为循环链表,可以使用Floyd判断环算法或龟兔赛跑算法。这种方法的时间复杂度同样是O...
在本压缩包文件中,我们关注的是一个Java编程相关的学习资源,主要涵盖了LeetCode平台上的第160题——“相交链表”。这是一道经典的算法问题,旨在锻炼和提升程序员对链表操作的理解与处理能力。LeetCode是一个广受...
在Python编程领域,LeetCode是一个非常重要的在线平台,它提供了大量的编程题目,旨在帮助程序员提升算法能力和准备求职面试。本题解将详细讨论LeetCode中的第160题——"相交链表",并使用Python语言进行解答。此...
双向链表每个节点还包含一个指向前一个节点的指针,而循环链表则将最后一个节点的指针链接回链表的第一个节点。 ### 3. 链表类的设计 在实现整数链表时,首先需要创建一个类,比如命名为`IntegerLinkedList`。这个...
单向链表是一种基本的数据结构,它在计算机科学和编程中有着广泛的应用。与数组不同,链表中的元素不是在内存中连续存储的,而是通过指针或引用连接在一起,形成一个逻辑上的线性序列。单向链表的每个节点包含两部分...
它与数组不同,数组中的元素在内存中是连续存储的,而链表的每个元素(节点)包含数据以及指向下一个节点的指针,这使得链表在动态添加、删除元素时具有更高的灵活性。本压缩包文件“个人C语言学习实录练习题-链表....
在Java编程中,链表是一种常见且重要的数据结构,它被广泛用于处理动态集合,尤其在需要高效插入和删除操作的场景下。本主题聚焦于如何利用数据结构的方法去除链表中的重复元素,以优化链表的数据存储和提高程序效率...
双链表(Double-Linked List)是链表的一种变体,它在每个节点中不仅存储了数据,还额外存储了两个指针,分别指向该节点的前一个节点和后一个节点,这使得在链表中的插入和删除操作更加高效。 在“Double-list.zip...
- 循环链表:最后一个节点的指针指向头节点,形成一个循环。 - 带头节点的链表:链表额外添加一个头节点,方便操作。 2. 链表的操作: - 插入:在链表的特定位置插入新节点,需要找到插入点,然后修改插入点前一...
代码通常会包括一个`isPalindrome`函数,它接受一个链表的头节点,然后进行相应的操作以判断链表是否为回文。 **优化和复杂度分析** 对于这两种方法,时间复杂度都是O(n),其中n是链表的长度,因为我们需要遍历...
* 如果l1和l2都不为空,则一直循环取值比较//如果l1比l2小,将l1赋值给listNode的下一个节点,l1指针下移* 如果一个链表空了,则将另一个链表复
线性表的数据元素之间存在唯一的前驱和后继关系,每个元素都有且只有一个“前驱元素”和一个“后继元素”,除第一个元素外,每个元素都有且只有一个“前驱元素”,除最后一个元素外,每个元素都有且只有一个“后继...
与数组不同,链表的元素不需要连续的内存空间,每个元素(称为节点)包含数据和指向下一个节点的引用。本资源专注于Python中链表的实现,通过实验五的描述,我们可以学习以下关键知识点: 1. **链表的基本概念**: ...
数据结构-链表.ppt 头指针、头结点、开始结点的区别、并说明头指针和头结点的作用
循环链表与双向链表类似,不同之处在于最后一个节点的指针会回指到第一个节点,形成一个闭合的环状结构。这种结构使得在链表末尾进行插入和删除操作时更为高效,因为它避免了检查是否到达链表末尾的额外步骤。循环...
在这个“头插法、尾插法、链表长度test_c-master.zip”压缩包中,我们可以推测包含的是关于链表操作的C语言实现,主要涉及了链表的头插法和尾插法以及如何计算链表的长度。 首先,让我们详细探讨一下链表中的头插法...
**标题解析:** "Generic-Doubly-Linked-List-..zip_generic" 这个标题表明,这是一个关于泛型(Generic)双向链表(Doubly-Linked List)的资料包,可能是用C或C++语言编写的。"Generic"指的是在编程中使用模板或者...