题目
给你一个链表,删除链表的倒数第 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
解释与代码
方法有三种:
- 最普通的长度计算(遍历一遍,然后第二次扫描到的时候处理)
- 用栈进行辅助(入栈,弹出时计数)
- 双指针(first比second超前n)
以栈的写法为代码示例
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
stack<ListNode*> sl;
ListNode* sw = head;
while (head) {
sl.push(head);
head = head->next;
}
int cnt = 0;
while (1) {
cnt++;
if (cnt == n) {
if (sl.size() == 1) {// l
return sl.top()->next;
} else {
sl.pop();
sl.top()->next = sl.top()->next->next;
return sw;
}
}
sl.pop();
}
return head;
}
};