题目:输入一个链表,输出该链表中倒数第k个结点。
提供三种思路吧。
1.快慢指针。快指针直接走K步。然后快慢一起走
2.vector<ListNode*> 一次遍历,把所有的都存起来,然后下标查找。时间复杂度也是O(n)。缺点就是申请了额外的空间。
3.反转链表,走K步。
在剑指offer上,第三个方法无法通过,因为他的判题法则是输出该点后所有的链表。反转之后,就变了。但理论上是可以的啊,返回一个点呀。
我把方法1和3的都贴出来了。
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead == NULL)
return NULL;
ListNode* slow = pListHead;
ListNode* fast = pListHead;
int i = 0;
while(i++<k){
if(fast == NULL)
return NULL;
fast = fast->next;
}
while(fast!=NULL){
fast=fast->next;
slow=slow->next;
}
return slow;
}
ListNode* pre = NULL;
ListNode* cur = pListHead;
ListNode* nex = NULL;
while(cur){
nex = cur->next;
cur->next = pre;
pre = cur;
cur = nex;
}
ListNode* temp = pre;
int i=1;
while(i++<k){
temp = temp->next;
if(temp == NULL)
return NULL;
}
return temp;
加油!