双指针(Java)
核心思想: 设置前、后两个指针(front和rear)分别指向链表的实际头结点head和理论头结点listHead(为了方便操作而自主创建的),前指针front先移动n个结点,若前指针front不为空,则说明链表存在倒数第n个结点,然后前后指针同时移动,直至前指针front为空,此时后指针rear指向待删结点的前一个结点,后指针rear指向结点的next指向待删结点的后一个结点即可。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//由于链表的头结点head已经指向第一个数据结点,当待删结点为head结点时,为了方便操作,创建理论上的头结点
ListNode listHead = new ListNode(0, head);//理论上的头结点
ListNode front = head;//前指针
ListNode rear = listHead;//后指针
for(int i = 0; i < n; i++)//前指针先移动n个结点
front = front.next;//题目限定n的取值范围,可省略空指针异常判断
while(front != null){//前后指针同时移动
front = front.next;
rear = rear.next;
}
ListNode quit = rear.next;//指向待删结点
rear.next = quit.next;//删除待删结点
return listHead.next;//返回链表的头结点head
}
}