【剑指offer】链表中倒数第k个结点 python+C++

166 阅读1分钟

【题目描述】

输入一个链表,输出该链表中倒数第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;
    }
};