题目描述:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点
方法1:快指针先走n步,两个指针再一起走,直到快指针的下一个节点为空,此时慢指针指向删除节点的前一个节点
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *p = head;//快指针,先走n步
ListNode *q = head;//慢指针,指向删除节点的前一个节点
while(p && n>0){
p = p->next;
n--;
}
if(p == nullptr){
return head->next;//处理删除倒数第n个,即头节点的情况
}
while(p->next != nullptr){
p = p->next;
q = q->next;
}
q->next = q->next->next;
return head;
}
};
方法2:使用栈
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
stack<ListNode*> sck;
ListNode *temp = new ListNode();
temp->next = head;//避免处理第一个节点不一致的操作
ListNode *p = temp;
while(p){
sck.push(p);
p = p->next;
}
while(n--) sck.pop();
ListNode *q = sck.top();
q->next = q->next->next;
return temp->next;
}
};