19. 删除链表的倒数第N个节点
难度中等1109收藏分享切换为英文接收动态反馈
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
思路:
1.就是很正常,先遍历一遍求链表长度sum,在通过sum-n+1得到正向要删除节点的下标设为m,更新第m-1个节点的next即可,最后返回head。不过要对删除第一个元素的情况,进行特殊处理。
2.采取双重遍历肯定是可以解决问题的,但题目要求我们一次遍历解决问题,那我们的思路得发散一下。
我们可以设想假设设定了双指针 p 和 q 的话,当 q 指向末尾的 NULL,p 与 q 之间相隔的元素个数为 n 时,那么删除掉 p 的下一个指针就完成了要求。设置虚拟节点 dummyHead 指向 head;设定双指针 p 和 q,初始都指向虚拟节点 dummyHead;移动 q,直到 p 与 q 之间相隔的元素个数为 n;同时移动 p 与 q,直到 q 指向的为 NULL;将 p 的下一个节点指向下下个节点
动图示例如下:
正常思路AC代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
int sum=0;
ListNode* temp=head;
while(temp!=nullptr)//sum:节点总数
{
sum++;
temp=temp->next;
}
if(sum==n)//搞第一个 需要单独讨论
return head->next;
int dis=sum-n+1;//dis:正数第几个元素
temp=head;
while(temp!=nullptr&&dis>2)//只需要更改这个元素前一个元素,因为是从第一个元素开始的,所以只需要进行dis-1-1轮就可以了
{
dis--;
temp=temp->next;
}
temp->next=temp->next->next;
return head;
}
};
一次遍历(双指针)AC代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead=new ListNode(0,head);
ListNode* p=dummyHead;
ListNode* q=dummyHead;
for(int i=0;i<n+1;i++)//p q相隔n个单元,即p-q=n+1时,可以保证q指向nullptr时,p指向倒数第n+1个元素
q=q->next;
while(q)
{
p=p->next;
q=q->next;
}
ListNode* delNode=p->next;
p->next=delNode->next;//指向操作
delete delNode;
ListNode* reNode=dummyHead->next;
delete dummyHead;
return reNode;
}
};
解释说明:
一遍遍历思路挺好的:转载于:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/solution/dong-hua-tu-jie-leetcode-di-19-hao-wen-ti-shan-chu/
然后发现宝藏博主:程序员吴师兄
他的个人网站:https://www.cxyxiaowu.com