Day85 | 灵神 | 前后指针 删除链表中的节点 删除链表的倒数第 N 个结点

237. 删除链表中的节点

237. 删除链表中的节点 - 力扣(LeetCode)

思路:

把下一个结点的值复制到当前结点,那当前结点就是下一个结点的前一个结点,然后删除下一个结点即可

完整代码:

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
void deleteNode(ListNode* node) {
*node=*(node->next);
/*
相当于
node->val=node->next->val
node->next=node->next->next
*/
}
};

19. 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

思路:

设置两个指针pre和cur,让cur开始时比pre快n步,那么只要cur遍历到末尾时,pre指向的就是倒数第n个

但是删除一个结点要知道删除节点的前一个结点,所以我们一开始就让cur比pre快n+1步,这样pre指向倒数n+1个,那就好删除倒数第n个了

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode * t=new ListNode;
t->next=head;
ListNode* cur=head;
ListNode* pre=t;
while(n--)
cur=cur->next;
while(cur)
{
cur=cur->next;
pre=pre->next;
}
pre->next=pre->next->next;
return t->next;
}
};