0
点赞
收藏
分享

微信扫一扫

剑指offer T26 重排链表

深夜瞎琢磨 2022-03-11 阅读 40

题目:
在这里插入图片描述
思路:
这道题有点麻烦。
首先先找到这个链表的中点(快慢指针同时走,快指针走到尽头的时候,慢指针正好是链表的中点)
然后拆分成两个链表,把第二个链表反转
最后是在按要求把这两个链表接上

package 剑指offer;

public class t26重排链表 {

    //把链表拆分成两段
    public void reorderList(ListNode head) {
        //哨兵节点
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        //快慢指针
        ListNode fast = dummy;
        ListNode slow = dummy;
        //遍历
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next;
            if (fast.next != null) {
                fast = fast.next;
            }
        }
        //遍历到最后,fast值指向链表的最后一个节点
        //low指针指向链表的中间那个节点
        ListNode temp = slow.next;
        slow.next = null;
        //链接起来
        link(head, reverseList(temp), dummy);
    }
    //联系链表的操作
    private void link(ListNode node1, ListNode node2, ListNode head) {
        ListNode prev = head;
        while (node1 != null && node2 != null) {
            //先储存起node1的下一个节点
            //之所以需要先把node1的下一个节点储存,是因为node1接在node2后,无法再执行node1=node1.next
            ListNode temp = node1.next;


            prev.next = node1;
            node1.next = node2;
            prev = node2;

            node1 = temp;
            node2 = node2.next;
        }
        if (node1 != null) {
            prev.next = node1;
        }
    }

    private ListNode reverseList(ListNode first) {
        ListNode prev = null;
        ListNode cur = first;
        ListNode head = null;
        while (cur != null) {
            ListNode next = cur.next;
            cur.next = prev;
            if (next == null) {
                head = cur;
            }
            prev = cur;
            cur = next;
        }
        return head;
    }

}

举报

相关推荐

0 条评论