1.双指针,指针A先移动n次, 指针B再开始移动。当A到达null的时候, 指针b的位置正好是倒数n
我们可以设想假设设定了双指针p和q的话,当q指向末尾的NULL,p与q之间相隔的元素个数为n时,那么删除掉p的下一个指针就完成了要求。
设置虚拟节点dummyHead指向head
设定双指针p和q,初始都指向虚拟节点dummyHead
移动q,直到p与q之间相隔的元素个数为n
同时移动p与q,直到q指向的为NULL
将p的下一个节点指向下下个节点
2.javacode
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head==null) return null;
//细节,需要定义一个指向开头的指针
ListNode resulthead = new ListNode(0);
resulthead.next = head ;
//这里有个细节,不能将first和second定义为头结点,否则会出现很多问题
ListNode first = resulthead;
ListNode second = resulthead;
for( int i=0; i<n; i++)
{
first = first.next;
}
while (first.next!=null)
{
first = first.next;
second = second.next;
}
second.next = second.next.next ;
return resulthead.next;
}
3.注意细节,思路很简单