删除链表的中间节点

30 阅读1分钟
/**
 * 给你一个链表的头节点 head 。删除 链表的 中间节点 ,并返回修改后的链表的头节点 head 。
 *
 * 长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点(下标从 0 开始),其中 ⌊x⌋ 表示小于或等于 x 的最大整数。
 *
 * 对于 n = 12345 的情况,中间节点的下标分别是 01122
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/delete-the-middle-node-of-a-linked-list
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
public class DeleteMiddle {

    /**
     * 题解:
     *   使用快慢指针的方式完成.cur指针每往后移动两个节点,middle只移动一个节点.在cur处于最后一个节点的时候,middle的下一个即为需要跳过的节点.
     * @param head
     * @return
     */
    public ListNode deleteMiddle(ListNode head) {
        if (head == null || head.next == null) {
            return null;
        }
        ListNode cur = head.next;
        ListNode middle = head;

        while (cur.next!= null && cur.next.next!= null) {
            cur = cur.next.next;
            middle = middle.next;
        }
        return middle;
    }

    private class ListNode {
        ListNode next;
    }
}