【题目描述】
输入一个链表,输出该链表中倒数第k个结点
【思路】
方法1.首先我想到用队列,使得队列长度为k,从头到尾遍历链表并且不断更新这个队列。等遍历到尾节点,就输出队列中的第一个节点即可。
python:
class Solution:
def FindKthToTail(self, head, k):
if(not head or k==0):
return None
re=[]
count=0
while(head!=None):
count+=1
if(len(re)<k):
re.append(head)
elif(len(re)==k):
re.pop(0)
re.append(head)
head=head.next
return re[0]if count>=k else None
方法2.但是发现更好的是用双指针,这样可以避免使用队列浪费内存空间。 p1,p2开始都指向头节点,p1先开始移动,到k-1处之后,二者一起向后移动,当p1指向尾结点,p2指向倒数第k个结点。
时间复杂度都为O(n),一次遍历链表解决.
【代码】
pythopn:
class Solution:
def FindKthToTail(self, head, k):
if(k==0 or not head):#鲁棒性,考虑三种特殊情况,这是其中两种
return None
p1=p2=head
count=1
while(count<k):
count+=1
p1=p1.next
if not p1:#第三种特殊情况,k大于链表长度
return None
while(p1.next!=None):
p1=p1.next
p2=p2.next
return p2
C++:
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(k==0||pListHead==NULL){
return NULL;
}
ListNode* p1= pListHead;
ListNode* p2= pListHead;
int count=1;
while(count<k){
count++;
p1=p1->next;
}
if(p1==NULL){
return NULL;
}
while(p1->next!=NULL){
p1=p1->next;
p2=p2->next;
}
return p2;
}
};