【剑指offer】面试题15:链表中倒数第k个结点

来源:互联网 发布:上海网络推广铭心 编辑:程序博客网 时间:2024/06/08 18:32

题目描述

输入一个链表,输出该链表中倒数第k个结点。

解法一:假设整个链表有n个节点,那么倒数第k个节点就是从头结点开始的第n-k+1个节点。

             (1) 遍历整个链表,统计出链表中节点的个数。

             (2) 从头结点走到第n-k+1个节点,即为倒数第k个节点。

             缺点:需要遍历两次链表。

解法二:定义两个指针。

              (1) 第一个指针从链表头指针开始遍历向前走k-1,第二个指针保持不动

              (2) 从第k步开始,第二个指针也开始从链表的头指针开始遍历。

              (3) 由于两个指针的距离保持在k-1,当第一个指针到达链表尾节点时,第二个指针正好是倒数第k个节点。

下图展示了在有6个结点的链表上找倒数第3个结点的过程:


代码如下:

/*struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}};*/class Solution {public:    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)     {        if(pListHead==NULL || k==0)            return NULL;                ListNode *p1=pListHead;        ListNode *p2=NULL;                for(unsigned int i=0;i<k-1;++i)        {            if(p1->next!=NULL)                p1=p1->next;            else                 return NULL;        }                p2=pListHead;                while(p1->next!=NULL)        {            p1=p1->next;            p2=p2->next;        }                return p2;        }};


阅读全文
0 0
原创粉丝点击