题目链接:
题目描述:
思路:
如果要删除倒数第n个,指针应该定位到倒数第n+1个,
如示例1,删除4,应该定位到3
怎么定位到3?
当node.next是null,我们知道这个节点是尾节点
尾节点和倒数第n+1个节点的距离是:n+1,这个距离是不会变的
所以可以用双指针,slow从头节点开始,fast从n+1个节点开始
注意:
对于只有一个节点的链表:slow.next = slow.next.next显然不成立
最少需要两个节点,所以我们要构建一个虚拟头节点,让slow从这个虚拟头节点开始走,避免一个节点错误
也可以用栈,把node都放进栈,然后弹出n个,这时候栈顶就是第n+1个节点。
实现代码:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode();
dummy.next = head;
ListNode slow = dummy, fast = head;
for(int i = 0; i < n; i++){
fast = fast.next;
}
while(fast != null){
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return dummy.next;
}
}
- 栈
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0,head);
Deque<ListNode> stack = new LinkedList<ListNode>();
ListNode cur = dummy;
while(cur != null){
stack.push(cur);
cur = cur.next;
}
while(n > 0){
stack.pop();
n--;
}
ListNode prev = stack.peek();
prev.next = prev.next.next;
return dummy.next;
}
}