1.输入一个链表,输出该链表中倒数第k个结点。OJ链接
代码如下:
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null||k<0)return null;
ListNode fast = head;
//快指针先走k-1步
while(k-1!=0 && fast!=null){ //这里当k大于链表长度时fast会指向null
fast = fast.next;
k--;
}
if(fast==null)return null;
ListNode slow = head;
while(fast.next!=null){
fast = fast.next;
slow = slow.next;
}
return slow;
}
2.给定一个链表,判断链表中是否有环。OJ链接
代码如下:
public boolean hasCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast!=null&&fast.next!=null){
fast = fast.next.next;
slow = slow.next;
if(fast==slow){
return true;
}
}
return false;
}
3.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL。OJ链接
代码如下:
public ListNode detectCycle(ListNode head) {
if(head == null){
return null;
}
ListNode fast = head;
ListNode slow = head;
while(fast!=null&&fast.next!=null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){ //相遇
fast=head; //fast开始从头节点走,slow从相遇节点继续走
while(fast!=slow){
fast = fast.next;
slow = slow.next;
}
//第一次相遇的节点即为入环的第一个节点
return fast;
}
}
return null;
}
欢迎大家指出其中的不足,也可以分享自己的想法!