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 };
在代码的世界尽情的翱翔吧!