删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:输入:head = [1], n = 1
输出:[]
示例 3:输入:head = [1,2], n = 1
输出:[1]
提示: 链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz
思路
首先因为需要删除倒数第n个节点,所以需要查找单链表中到处的倒数第n个节点的前一个结点,我们可以通过前后指针来实现:先让前面的指针走到正向第n+1个节点,此时距离最后一个节点(len-n-1),随后前后指针同时移动,当指针走到最后一个节点时,后指针刚好走到倒数n+1个节点
c++代码
/**
* 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* temp = new ListNode;
temp->next = head;
//定义前后指针
ListNode* pAhead = temp;
ListNode* pBhead = temp;
//前指针移动到第n-1个节点(n-1)
for(int i = 0; i < n + 1; i++)
{
pAhead = pAhead->next;
}
//前后指针同时移动,当最后一个指针指向最后一个时,此时在第n个的前一个
while (pAhead != NULL)
{
pAhead = pAhead->next;
pBhead = pBhead->next;
}
//进行删除
pBhead->next = pBhead->next->next;
//返回值
return temp->next;
}
};