力扣-19-删除链表倒数第N个结点/《剑指Offer》-22-链表中倒数第K个节点
作者:互联网
可以看出,《剑指Offer》-22是力扣-19的子问题
找到链表中倒数第K个节点
《剑指Offer》-22,一次遍历单向链表得到倒数第K个结点的方法
从1开始倒数,那么倒数第K个节点即是正数第N-K+1个节点
这里还是使用同向双指针的办法
pointer1/pointer2都初始化为指向0,pointer1先开始走而pointer2不动,当pointer1走完第K-1步后,pointer2开始同步pointer1往后走,这样始终保持了两个指针间距为K-1
则最终,当pointer1指向第N个节点时,pointer2指向的便是第N-K+1个节点,即倒数第K个节点
代码实现
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* temp = new ListNode(0,head);
ListNode* pointer1=head;
ListNode* pointer2=temp;
// 这里不需要做检查,n一定是合法的
for(int i=0;i<n;++i){
pointer1 = pointer1->next;
}
// 移动
while(pointer1){
pointer1=pointer1->next;
pointer2=pointer2->next;
}
pointer2->next=pointer2->next->next;
ListNode* ans = temp->next;
delete temp;
return ans;
}
};
官方题解
初级算法里面所谓的“Dummy node”节点技巧就是添加一个指向头节点的节点,目的是为了解决头节点被操作的情况(例如被删了)
标签:ListNode,22,pointer1,pointer2,节点,链表,next,倒数第 来源: https://www.cnblogs.com/yaocy/p/16350236.html