使用两个工作指针p1,p2,p1指向头结点,p2指向顺数第n+1个节点,p1,p2同时后移,当p2移动到末尾时,p1指向倒数第n+1个节点
(单链表:删除倒数第n个节点,则需指针记录倒数第n+1个节点)
java代码:
/**
* 使用两个工作指针p1,p2
* p1指向头结点,p2指向顺数第n+1个节点
* p1,p2同时后移,当p2移动到末尾时,p1指向倒数第n+1个节点
* (单链表:删除倒数第n个节点,则需指针记录倒数第n+1个节点)
*
* */
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode p1, p2;
p1 = p2 = head;
//p2移动到顺数第n+1个节点
for(int index = 0; index < n; index++)
p2 = p2.next;
//判断p2是否移动到链表末尾,即n等于链表长度的情况
if(null == p2){
head = head.next;
return head;
}
//p1,p2同时后移
while(null != p2.next){
p1 = p1.next;
p2 = p2.next;
}
//删除倒数第n个结点
p1.next = p1.next.next;
return head;
}