题解 | #链表中倒数最后k个结点#
链表中倒数最后k个结点
http://www.nowcoder.com/practice/886370fe658f41b498d40fb34ae76ff9
方法一:栈辅助
题目要求的是倒数第k个结点,以后后面的所有节点,那我们就可以把链表的所有元素全部放入栈中,然后依次弹出k-1个,此时栈顶的结点就是第k个结点;
思路大致如下:
(1)创建栈,遍历链表,依次把链表元素入栈;
(2)栈中再依次弹出k-1个元素;
(3)返回栈顶元素
注意:如果给定的k大于了栈的长度,说明找不到这个元素,返回空指针
if(pHead == nullptr) return nullptr; ListNode* p = new ListNode(-1); p = pHead; stack<ListNode*> s; while(p) { s.push(p); p = p->next; } if(k > s.size() || k == 0) return nullptr;//超出了栈的长度,找不到 for(int i = 1;i < k;i ++) { s.pop(); } return s.top();
方法二:快慢指针
定义两个指针,分别给其命名为快慢指针,且都将头节点赋给两个指针,然后让快指针先走k个结点,这样两个指针的距离就是k了,最后两个指针分别往后走,当快指针走到头了,慢指针就到了倒数第k个结点了;
思路如下:
(1)定义两个快慢指针,并将头节点赋给它们
(2)让快指针先走k个结点,使两个指针保持距离为k
(3)两个指针同时往后走,当快指针走到头了,慢指针就到了倒数第k个结点了
(4)返回慢指针
if(pHead == nullptr) return nullptr; ListNode* faster = pHead; ListNode* slower = pHead; for(int i = 0;i < k;i++) { if(faster == nullptr) return nullptr; faster = faster->next; } while(faster != nullptr) { faster = faster->next; slower = slower->next; } return slower;