LeetCode第十九题(删除链表的倒数第 N 个结点)

203 阅读1分钟

双指针(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
    }
}