删除链表的倒数第 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
我的代码:
/**clike
* 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 i = 0;
struct ListNode* p, *q;
p = q = (struct ListNode*) malloc(sizeof (struct ListNode));
p->next = head;
q->next = head;
// 先让前指针移动n个单位
while(i < n)
{
q = q->next;
i ++;
}
// 然后再让q,p一起移动, 当q移动到NULL的时候
// 就是p移动到倒数第n个位置的时候
while(q->next != NULL)
{
q = q->next;
p = p->next;
}
if (p->next == head) // 如果链表没有变过 就直接返回
{
return head->next;
}
else
{
// 这一步就是删掉倒数第n个点
p->next = p->next->next;
}
return head;
}
};