给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
(1)创建两个指针,分别为fast和slow。
(2)fast先向前移动n+1位,然后和slow同时移动,就能让slow到待删除元素的前面,然后执行删除操作即可。
/**
* 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 *vHead = new ListNode(0);
vHead->next = head;
//建立快慢指针
ListNode *fast = vHead;
ListNode *slow = vHead;
//fast向后移动n+1位
for(int i = 0; i < n+1; i++){
fast = fast->next;
}
//将slow移动到倒数第n个结点的前一个结点
while(fast != NULL){
fast = fast->next;
slow = slow->next;
}
//删除节点
ListNode *tmp = slow->next;
slow->next = tmp->next;
delete tmp;
return vHead->next;
}
};
(1)建立一个栈和虚拟头结点。
(2)将全体结点压入栈。
(3)对栈顶的n个元素执行出栈操作,此时top为待删除元素的前一个元素,在链表的对应结点中执行删除操作即可。
/**
* 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) {
//建立一个栈
stack<ListNode*> s;
//建立一个虚拟头结点
ListNode *vHead = new ListNode(0);
vHead->next = head;
//将vHead在内的全体结点压入栈
ListNode *p = vHead;
while(p != NULL){
s.push(p);
p = p->next;
}
//将栈顶的n个出栈
for(int i = 0; i < n; i++){
s.pop();
}
//此时top为待删除元素的前一个元素,执行删除操作即可
ListNode *tmp = s.top();
ListNode *tmp1 = tmp->next;
tmp->next = tmp1->next;
delete tmp1;
return vHead->next;
}
};