每日一题 143重排链表

题目

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

每日一题 143重排链表_第1张图片

输入:head = [1,2,3,4]
输出:[1,4,2,3]

示例 2:

每日一题 143重排链表_第2张图片

输入:head = [1,2,3,4,5]
输出:[1,5,2,4,3]

题解

/**
 * 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 void reorderList(ListNode head) {
        //先将中点右侧的部分翻转
        ListNode mid = middleNode(head);
        ListNode head2 = reserveList(mid);
        while (head2.next != null) {
            ListNode nxt = head.next;
            ListNode nxt2 = head2.next;
            head.next = head2; //1->5
            head2.next = nxt; //5->2
            head = nxt; //2上
            head2 = nxt2; //4上
        }
    }
    private ListNode reserveList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode nxt = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nxt;
        }
        return pre;
    }
    private ListNode middleNode(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
}

你可能感兴趣的:(链表,算法,数据结构,java)