链表中倒数第k个节点
思路1:
先遍历链表一次,统计出链表节点个数n,
然后,倒数第k个节点是,n-k+1。
缺点:该方法需要遍历两次列表。
思路2:
定义两个指针,第一个指针向前遍历k-1步,第二个指针保持不动;
从第k步开始,第二个指针从链表头指针开始遍历,当第一个指针到底链表的尾端,第二个指针正好指向倒数第k个节点。
注意点:
1.pListHead为空指针
2.pListHead的链表节点数少于k
3.输入参数为0,由于k是一个无符号整数,k-1会得到0xFFFFFFFF,循环次数超过预计
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 if(pListHead == nullptr || k == 0) 13 return nullptr; 14 ListNode * pAhead = pListHead; 15 ListNode * pBehind = nullptr; 16 17 for(unsigned int i = 0; i < k-1; i++) 18 { 19 if(pAhead->next != nullptr) 20 pAhead = pAhead->next; 21 else 22 { 23 return nullptr; 24 } 25 } 26 27 pBehind = pListHead; 28 while(pAhead->next != nullptr) 29 { 30 pAhead = pAhead->next; 31 pBehind = pBehind->next; 32 } 33 return pBehind; 34 } 35 };