【Leetcode】12打印链表倒数第k个节点

题目:如题

知识:链表

思路:链表是单向的,可以制造一个跨度为k的尺子,当尺子的末端走到链表的末端时,那么尺子的前段就是倒第k个数。

程序:

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        ListNode* p=pListHead;
        ListNode* q=p;
        int i=0;
        for(;q !=NULL;i++)
        {
            if(i>=k)
                p=p->next;
            q=q->next;
        }
        return i<k?NULL:p;
    }
};

难点在于几个条件的具体:

         1,q!=NULL

                      q是尺子的末端,而链表最后一个节点->next=NULL,所以到最后,q是NULL,然后退出循环。

         2,i>=k

                      一开始,先让q往末端走,走到p和q之间的跨度达到k时,接下来两者一起往末端走。

                     假设k=3。 i=0,p、q都在开头;

                                        i=1,p在开头,q在第二个;

                                        i=2,p在开头,q在第三个;

                                        i=3,p在开头,q在第四个;

                                        在此之前,每次进入循环,i代表的是pq两者的差值。

                                        此时,i=3,pq之间差值为3(=k)个节点(算头算尾总共4个节点)。

                     现在开始两者一起往末端走,得一直走到 q站在最后一个节点后面,(是个空地址),按照两者差值为3,p才在倒数第三个节点的位置。总结就是“差值为3”和“加上自身总共4个",这一点容易混淆人。

          3,i<k?

                        每次进入循环,i代表q所在位置的索引,最后退出循环时,q站在最后一个节点后面,重点来了:然后和for循环条件比较时,虽然条件不符合退出,但i仍然+1了。(即:for(i=0;i<10;i++)循环退出时,i=10.)所以此时i值是链表的size。

猜你喜欢

转载自blog.csdn.net/ethan_guo/article/details/81386700