-
双指针法
- 既然是删除节点,那我们肯定要考虑删除头节点的情况,所以,要想不对头节点进行特殊操作,我们需要声明哑节点来一般化头节点。
- 我们知道,经典的倒数第几个节点的问题,可以用双指针解决,原理就是两个节点初始化都指向头节点,第一个节点先走n个单位,然后两个节点一起向前遍历,这样我们保证了两个节点的相对距离永远是n,那么到第一个节点为null时,第二个节点就在倒数第n个节点位置。
- 再看第二个问题,要删除此时的倒数第n个节点,而对链表删除操作来说,要获得要删除节点的前一个节点,这样方便我们对链表进行重新连接,所以我们可以将第二个节点初始化为哑节点,这样保证了第二个节点的下一个节点作为要删除的节点。
class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { //虚拟头节点 ListNode dummyHead=new ListNode(0,head); ListNode p=head; //q不能直接指向null,要先分配空间来储存 ListNode q=dummyHead; for(int i=0;i<n;i++){ p=p.next; } while(p!=null){ p=p.next; q=q.next; } q.next=q.next.next; ListNode ans=dummyHead.next; return ans; } }