Java关于重排链表详细解析

2022-07-18,,,,

1.题目

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

 l0→ l1 → … → ln-1 → ln  请将其重新排列后变为:

l0 → ln → l1 → ln-1 → l2 → ln-2 → …

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

 来源:力扣(leetcode)

2.解析

将一个链表分为两个子链表,然后将其归并。

我们要先找到链表的中间节点,在中间节点将其断开

然后反转后半链表

再将两个子链表逐个连起来

 将后半链表反转,独立成一个子链表。

最后将两个子链表的节点逐个连接就ok了

3.代码

class solution {
    public void reorderlist(listnode head) {
        
        listnode fast = head;
        listnode slow = head;
        //找中间节点
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        //截断链表
        listnode cur = slow.next;
        slow.next = null;
        //反转后半链表
        listnode node = null;
        while (cur != null) {
            listnode curnext = cur.next;
            cur.next = node;
            node = cur;
            cur = curnext;
        }
        //合并
        listnode prev = head;
        listnode l1 = node;
        while (l1 != null) {
            listnode next1 = prev.next;
            listnode next2 = l1.next;
            prev.next = l1;
            l1.next = next1;
            prev = next1;
            l1 = next2;
        }
        
 
    }
}

到此这篇关于java关于重排链表详细解析的文章就介绍到这了,更多相关java 重排链表内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

《Java关于重排链表详细解析.doc》

下载本文的Word格式文档,以方便收藏与打印。