题目
题解
双指针
最直接的想法,利用双指针找倒数第n个结点
需要注意的是,删除唯一的一个结点的情况,这个时候就需要虚拟头结点了,很好用(终于学会了!)
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyHead=new ListNode(0,head);
ListNode fast=head,slow=dummyHead;
//slow最后在倒数第(n+1)个节点
while(fast!=null){
fast=fast.next;
if(n==0)
slow=slow.next;
else
n--;
}
fast=slow.next;
slow.next=fast.next;
fast=null;
return dummyHead.next;
}
}
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)
栈
需要明白的一点是,结点入栈不代表断链,它的链的关系还在,更改这些链的关系就可以得到一条新链
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyHead=new ListNode(0,head);//虚拟头结点
Deque<ListNode>stack=new LinkedList<>();
ListNode p=dummyHead;
//结点入栈
while(p!=null){
stack.push(p);
p=p.next;
}
//弹出(n-1)个结点
while(--n!=0){
stack.pop();
}
p=stack.pop();
stack.peek().next=p.next;
return dummyHead.next;
}
}
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)