题目描述:
输入一个链表,输出该链表中倒数第k个结点
思路解析:
- 第一种思路:
按照常规的简单思路,统计链表中有多少个节点count
。而倒数第K
个结点就应该是从正向数的:index = count - k
个节点。这样做的话,时间复杂度为O(2*n)
,空间复杂度为O(1)
。 - 代码:
public static ListNode FindKthToTail(ListNode head,int k) {
int count = 0;
int index ;
ListNode node = head;
while(head!=null){
count++;//对链表计数
head = head.next;//指针移动
}
if(count<k){
return null;
}
//返回倒数第K个指针,就是返回count-k的正数个
index = count - k;
while (index!=0){
node = node.next;
index--;
}
return node;
}
- 第二种思路解析:快慢指针。这个思路是看了牛客上的讨论才想到的
设置两个指针,一个是快指针
,一个是慢指针
。快指针会比慢指针快k步
。也就是说先让快指针向前走K步。
然后再让快慢指针一起向前移动
,当快指针移动到末尾值为null
时,刚好与慢指针相隔k个位置,慢指针所指的就是需要的倒数第k个结点
。
这样做:
时间复杂度为:O(n)
空间复杂度为:O(1) - 代码:
public static ListNode FindKthToTail2(ListNode head,int k){
ListNode slow = head;
ListNode fast = head;
//将快指针先行K步
while (k!=0){
k--;
if(fast!=null){
fast = fast.next;
}else {
return null;
}
}
while (fast!=null){
slow = slow.next;
fast = fast.next;
}
return slow;
}