欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java关于重排链表详细解析

程序员文章站 2022-06-16 13:06:38
1.题目给定一个单链表 l 的头节点 head ,单链表 l 表示为: l0→ l1 → … → ln-1 → ln  请将其重新排列后变为:l0 → ln → l1 → ln-1 → l2 → ln...

1.题目

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

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

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

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

Java关于重排链表详细解析

 来源:力扣(leetcode)

2.解析

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

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

然后反转后半链表

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

Java关于重排链表详细解析

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

Java关于重排链表详细解析

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

Java关于重排链表详细解析

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 重排链表