LeetCode——143. 重排链表(链表)

143. 重排链表(链表)

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reorder-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目

给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…

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

示例 1:

给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:

给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.

思想**

19年408真题思想:
先遍历,将链表分为两半,后半部分逆置,再遍历前半部分链表,并将后面的链表的结点间隔着加入前半部分

代码**

/*
408真题思想:
先遍历,将链表分为两半,后半部分逆置,再遍历前半部分链表,并将后面的链表加入前半部分
*/

/**
 * 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) {
        if(head == null || head.next == null){
            return;
        }
        ListNode p = head;
        ListNode q = head;
        ListNode cur = head;
        while(q.next != null){//先遍历,将链表分为两半,首先双指针找到中间结点
            q = q.next;
            p = p.next;
            if(q.next != null){
                q = q.next;
            }
        }
        // q = p.next;//将q指针指向后半段链表,准备逆置
        // p.next = null; //p指针指向q的前一个结点,方便逆置
        // ListNode tmp;
        // while(q != null){
        //     tmp = q.next;
        //     q.next = p.next;
        //     p.next = q;
        //     q = tmp;
        // }
        // q = p.next;//q指向后半链表第一个结点
        // p.next = null;
        q = p.next;//将q指针指向后半段链表,准备逆置
        p.next = null; //p指针指向q的前一个结点,方便逆置
        ListNode tmp;
        ListNode pre = null;
        while(q != null){
            tmp = q.next;
            q.next = pre;
            pre = q;
            q = tmp;
        }
        q = pre;//q指向后半链表第一个结点
        p.next = null;
        while(q != null){
            tmp = q.next;
            q.next = cur.next;
            cur.next = q;
            cur = q.next;
            q = tmp;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34767784/article/details/107296824