如何判断单链表中是否有环?如何找到环中的起始节点
2014-06-16 21:42
696 查看
今天在leetcode上做了一道题:
Given a linked list, return the node where the cycle begins. If there is no cycle, return
下面给出解决思路:
(1)首先需要判断该链表是否存在环:设置两个指针,一个慢指针,一个快指针。慢指针每次走一步,快指针每次走两步。如果快慢指针最后相遇了则说明该链表有环,否则没有环。
(2)接下来就是找到环的起始节点:将相遇节点的前一个指针切断的话,这道题就是一道两个单链表如何判断相遇点的问题。
单链表判断相遇点的解决思路如下:
(1)计算链表1的长度为len1
(2)计算链表2的长度为len2
(3)比较len1和len2的大小,如果len1大,则先遍历链表1,遍历长度为len1-len2,此时两个链表再同时遍历,当指针指向同一个节点时,就为相遇节点,也就是环的第一个节点;如果len2大同理。
private ListNode firstCycle(ListNode cyclenode, ListNode head){
int lenhc = 1;
ListNode node1 = head;
while(node1.next != cyclenode){
node1 = node1.next;
lenhc++;
}
int lencc = 1;
ListNode node2 = cyclenode;
while(node2.next != cyclenode){
node2 = node2.next;
lencc++;
}
if(lenhc > lencc){
int diff = lenhc - lencc;
node1 = head;
while(diff != 0){
node1 = node1.next;
diff--;
}
node2 = cyclenode;
while(node1 != node2){
node1 = node1.next;
node2 = node2.next;
}
return node1;
}else{
int diff = lencc - lenhc;
node1 = cyclenode;
while(diff != 0){
node1 = node1.next;
diff--;
}
node2 = head;
while(node1 != node2){
node1 = node1.next;
node2 = node2.next;
}
return node1;
}
}
Given a linked list, return the node where the cycle begins. If there is no cycle, return
null
假设给定的例子如下:
下面给出解决思路:
(1)首先需要判断该链表是否存在环:设置两个指针,一个慢指针,一个快指针。慢指针每次走一步,快指针每次走两步。如果快慢指针最后相遇了则说明该链表有环,否则没有环。
/* *@param head *@return the node which they meet each other */ private ListNode CycleNode(ListNode head){ if(head == null || head.next == null){ return null; } ListNode slow = head; ListNode fast = slow.next; while(slow != fast){ if(fast.next != null && fast.next.next != null){ fast = fast.next.next; }else{ return null; } if(slow.next != null){ slow = slow.next; }else{ return null; } } return slow; }
(2)接下来就是找到环的起始节点:将相遇节点的前一个指针切断的话,这道题就是一道两个单链表如何判断相遇点的问题。
单链表判断相遇点的解决思路如下:
(1)计算链表1的长度为len1
(2)计算链表2的长度为len2
(3)比较len1和len2的大小,如果len1大,则先遍历链表1,遍历长度为len1-len2,此时两个链表再同时遍历,当指针指向同一个节点时,就为相遇节点,也就是环的第一个节点;如果len2大同理。
private ListNode firstCycle(ListNode cyclenode, ListNode head){
int lenhc = 1;
ListNode node1 = head;
while(node1.next != cyclenode){
node1 = node1.next;
lenhc++;
}
int lencc = 1;
ListNode node2 = cyclenode;
while(node2.next != cyclenode){
node2 = node2.next;
lencc++;
}
if(lenhc > lencc){
int diff = lenhc - lencc;
node1 = head;
while(diff != 0){
node1 = node1.next;
diff--;
}
node2 = cyclenode;
while(node1 != node2){
node1 = node1.next;
node2 = node2.next;
}
return node1;
}else{
int diff = lencc - lenhc;
node1 = cyclenode;
while(diff != 0){
node1 = node1.next;
diff--;
}
node2 = head;
while(node1 != node2){
node1 = node1.next;
node2 = node2.next;
}
return node1;
}
}
相关文章推荐
- 如何判断单链表是否有环,如果有怎么找到进入环的节点
- 8.判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度?
- 判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度?
- 【算法分析】如何理解快慢指针?判断linked list中是否有环、找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 为例Python实现
- 判断单链表中是否有环,找到环的入口节点
- 判断单链表中是否有环,找到环的入口节点
- 判断单链表是否有环,以及如何找起始点,环的长度
- 判断单链表中是否有环,找到环的入口节点
- 20140719 找到单链表的倒数第K个节点 判断一个链表是否成为一个环形 反转
- 判断单链表中是否有环,找到环的入口节点
- 判断一个单链表是否有环,如果有,找出环的起始位置 [No. 36]
- 如何判断单链表里面是否有环?
- 判断单链表是否有环 并找出第一个相交的节点
- 面试笔试系列-1 判断单链表是否存在环,找到环入口
- 如何判断单链表是否存在环
- 给定单链表的头结点,如何快速的找到倒数的第n个节点?
- 如何判断单链表里面是否有环【转载】
- 如何判断单链表里面是否有环?
- 如何判断单链表里面是否有环
- 如何判断单链表是否存在环