14链表中倒数第K个结点

 1 链表中倒数第K个结点
 2 //题目:输入一个链表,输出该链表中倒数第K个结点
 3 //思路:看到链表二话不说,先写链表结点定义
 4 struct ListNode
 5 {
 6     int val;
 7     struct ListNode* next;
 8     ListNode(int x):val(x), next(NULL){}
 9 };
10 //常规思想://然后,假设整个链表有n个结点,那么倒数第k个结点,就是正数的第n-k+1个结点。如果我们能够得到链表中结点的个数n,那么只要从头结点开始往后走n-k+1步就可以了。
11 //--------只能遍历一次链表----找到倒数第k个结点。--------
12 //第一个指针从链表的头结点开始遍历向前走k-1, 第二个指针保持不动;
13 //从第k步开始,第二个指针额开始从链表的头结点开始遍历,
14 //两指针的距离保持在k-1, 当第一个指针到达链表的尾结点时,第二个指针正好是倒数第k个结点。
15 class Solution
16 {
17 public:
18     ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
19     {
20         if (pListHead == NULL || k==0)
21         {
22             return NULL;
23         }
24         //遍历链表,先备份头结点,让第一个指针先走k-1步
25         ListNode* tmpNode = pListHead;
26         for (int i = 0; i < k-1; ++i)
27         {
28             if (tmpNode->next != NULL)
29             {
30                 tmpNode = tmpNode->next;
31             }
32             else
33             {
34                 return NULL;
35             }
36         }
37         //然后第二个指针从头开始走,第一个指针从k走,二者相差k-1步。当第一个指针走n-k-1,则第二个指针就走到了k步。
38         ListNode* tmpNode2 = pListHead;
39         while(tmpNode->next!= NULL)
40         {
41             tmpNode = tmpNode->next;
42             tmpNode2 = tmpNode2->next;
43         }
44         return tmpNode2;
45     }
46 };

 

posted @ 2017-08-20 20:54  繁星的夜空2012  阅读(114)  评论(0编辑  收藏  举报