题目描述:
输入一个链表,输出该链表中倒数第k个结点。
解题思路:
主要介绍两种方法:
1. 链表逆序+前第k个节点(容易想到的)
2. 快慢指针
1 . 链表逆序 + 前第k个节点
这里面难度主要就是前面的链表逆序,先介绍它!
如上图,我们在遍历链表的同时,将链表进行逆序!主要分为以下几步:
public ListNode converseList(ListNode head){
ListNode newHead = null;//逆序链表的头节点,一开始为null,对应到图中的1指向的null。
while(head != null){//遍历原链表
ListNode newNode = head;//将遍历到的节点1先存起来(若不存,后面head很快就被覆盖掉了!)
head = head.next;//下一个节点(此时,节点1对于原链表任务已经结束,可以任意操作节点1了!)
newNode.next = newHead;//将节点1指向null
newHead = newNode;//将节点1设置为反转链表的头节点。
}
return newHead;
}
上面的注释,详细介绍了一个周期,后面的每个节点都是这个周期操作!
那么,后面找第k个就很简单了, 代码就不了附!
2 . 快慢指针
原理,见上面的图,应该能够一眼看明白了!
下面主要结合代码看看具体怎么实现!
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
int count = 1;//快指针计数
ListNode fast = head;//快指针
ListNode slow = head;//慢指针
while(fast != null){
if(count > k){//此时,快指针到第k个节点,慢指针开始行动
slow = slow.next;
}
fast = fast.next;
count++;
}
if(count<=k)//循环结束后,要判断特殊情况,k值大于链表长度的情况
return null;
else
return slow;
}
}
End