19.删除链表的倒数第n个节点
标签:双指针,链表
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
思路:
为了方便第一个结点的删除,避免要讨论这种情况,设立一个头结点D, D.next指向head
1.设立两个指针,p,q都指向D
2.先让p先走n+1个结点,p在头结点,此时p和q相差n+1个结点,因为要删除一个结点必须知道他的前驱.
3.这是让p,q同时向前走,知道p等于结尾null了,这时q就是倒数第n+1个结点,删除q的下一个结点即可q.next=q.next.next
4…返回D.next即可
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public class Solution2 {
public ListNode removeNthFromEnd(ListNode head, int n){
ListNode D=new ListNode(0);
//设立头结点,方便处理第一个结点
D.next=head;
//p快指针,q满指针
ListNode q,p;
p=q=D;
//p先向前走n+1个结点
for(int i=0;i<n+1;i++){
p=p.next;
}
//p,q同时走
while(p!=null) {
p = p.next;
q = q.next;
}
//删除q的下个结点
q.next=q.next.next;
return D.next;
}
}