ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-08-25 23:57:02  阅读:106  来源: 互联网

标签:ListNode struct int next 链表 offer14 NULL 倒数第 指针


1. 题目描述

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

2. 思路和方法

  可以用两个指针,一个指针遍历到第k个结点的时候,第二个指针再走到第一个节点,然后两个指针的距离始终保持k-1。这样,当第一个指针的next==NULL,也就是走到最后一个节点的时候,第二个指针对应的位置,就是倒数第k个结点。这样的好处是能够节省一个循环,时间复杂度会相应降低,从Q(2N) 降低到到Q(N)。

  注意,但是需要一个小循环让第一个指针先走到第k个指针。同时也存在结点总数小于k的问题,如果循环还没有进行到k次,而第一个指针的已经是NULL,即走到头了,那么,函数返回NULL。

3. C++核心代码

 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6             val(x), next(NULL) {
 7     }
 8 };*/
 9 class Solution {
10 public:
11     ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
12         ListNode* p = pListHead;
13         ListNode* q = pListHead;
14         int i = 0;
15         for(;p != NULL;i++)
16         {
17             if(i >= k)
18             {
19                 q = q->next;
20             }
21             p = p->next;
22         }
23         return i < k ? NULL:q;
24     }
25 };
View Code

4. C++完整代码

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 struct ListNode {
 6     int val;
 7     struct ListNode *next;
 8     ListNode(int x) :
 9         val(x), next(NULL) {
10     }
11 };
12 
13 class Solution {
14 public:
15     ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
16         ListNode *first = pListHead;    //第一个指针first
17         ListNode *second = pListHead;    //第二个指针second
18         int i;
19         if (first == NULL)
20             return NULL;
21 
22         for (i = 1; i <= k; i++){        //i <= k,让第一个指针先走步
23             if (first->next == NULL)
24                 break;                    //如果已经走到头了,就跳出,否则继续走
25                 first = first->next;
26         }
27         while (first->next != NULL){    //如果第一个指针没有走到头,两个指针想跟着一起走,保持k-1的距离
28             first = first->next;
29             second = second->next;
30         }
31         return second;
32     }
33 };
34 
35 
36 
37 int main()
38 {
39     struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
40 
41     struct ListNode* r = (struct ListNode*)malloc(sizeof(struct ListNode));
42     p->val = 0;
43     p->next = NULL;
44 
45     for (int i = 1000; i >= 1; i--){
46         struct ListNode* t = (struct ListNode*)malloc(sizeof(struct ListNode));    //注意,这个空间申请一定要放到for循环内部。
47         t->val = i;    //这种方法是插在头节点p前面,当然也可以插在后面,也可以插在链表的尾部,但是为了方便,需要用一个指针始终指向链表的尾节点
48         t->next = p->next;
49         p->next = t;
50     }
51     Solution s;
52     r = s.FindKthToTail(p, 999);
53     cout << r->val << endl;
54 
55     system("pause");
56     return 0;
57 }
View Code

参考代码

https://blog.csdn.net/yummy_alice/article/details/81358894 

https://blog.csdn.net/u013686654/article/details/73827816

标签:ListNode,struct,int,next,链表,offer14,NULL,倒数第,指针
来源: https://www.cnblogs.com/wxwhnu/p/11410025.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有