题目描述: 删除链表的倒数第 n 个节点,并且返回链表的头结点(力扣19题)
-
法一:用找到链表倒数第N个结点的方法,来查找第N个位置
- 创建两个指针p1和p2,p1指向链表的亚结点(第二个结点,即头结点的下一个结点),P2指向链表的正数第N个结点。创建指针p3记录p1,用来返回
- 同时移动p1 和 p2 ,直到p2到尾。p1的下一个结点就是要删除的结点
- 删除 p1.next = p1.next.next;
- 返回p3,实际就是返回了删除后的p1指针
- 代码:
public ListNode removeNthFromEnd(ListNode head, int n) { // p1 p2 之间的长度为 n+1 ListNode p1 = new ListNode(0,head); ListNode p2 = head;// p1 是亚结点 ListNode p3 = p1;// 记录p1 for (int i = 1; i < n + 1; i++) {//查找n+1,也可以用++i if(p2 != null) p2 = p2.next; else if (p2 == null) break; } // 移动p2到达n的长度 while (p2 != null) { // 同时往后一步,保证p1 p2 之间距离为n p1 = p1.next; p2 = p2.next; } // 删除倒数第n个结点 p1.next = p1.next.next; /* 返回删除后的链表,因为p3记录的是p1的指针, p1包括一个空的首结点,所以去掉那个首节点就是经删除的链表 */ return p3.next; }