双指针,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。
我的代码:
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy=new ListNode();
dummy.next=head;
ListNode fast=dummy;
ListNode slow=dummy;
ListNode pre=null;
while(n-->0){
fast=fast.next;
}
while(fast!=null){
pre=slow;
slow=slow.next;
fast=fast.next;
}
pre.next=slow.next;
return dummy.next;
}
如果不用虚拟头节点,移除头结点和移除其他节点的操作是不一样的,删除头节点是将头结点向后移动一位,这样还得单独写一段逻辑来处理移除头结点的情况。
设置一个虚拟头结点的话,原链表的所有节点就都可以按照统一的方式进行移除了
总结
- 善于利用题目中给的参数作计数器,没必要再设置一个计数器然后与题目中的参数比较
- 删除节点时用上虚拟头节点,能避免删除实际头节点时的麻烦
最后,在return 头结点的时候,别忘了 return dummyNode->next, 这才是新的头结点