leetcode: Reorder List

本文介绍了一种链表重构算法,该算法通过将链表后半部分倒序并与前半部分交错连接来实现链表的重新排序。利用快慢指针找到链表中点,并将后半部分颠倒。在颠倒和插入节点时使用新对象避免变量改变带来的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题的难点在于链表是单向的...因而我们可以把后一半的链表倒序再插入前一半中...

利用快慢指针找到链表的中点并利用两个指针将后一半链表颠倒...

插入的时候按次将点到后的后一半节点插入到前一般中即可.....

需要注意的是在颠倒和插入节点的时候,最好使用新的对象来避免之后变量改变导致之前也受影响....还是需要细心,多考虑可能出现的边界情况

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public void reorderList(ListNode head) {
        if(head == null)
        {
            return ;
        }
        ListNode slow = head;
        ListNode fast = head;
        int len=1;
        while(fast.next!=null&&fast.next.next!=null)
        {
            slow = slow.next;
            fast = fast.next.next;
            len++;
        }
        if(len==1)
        {
            return ;
        }
        ListNode half_start = slow.next;
        ListNode bef = null;
        while(half_start!=null)
        {
            ListNode now = new ListNode(half_start.val);
            half_start = half_start.next;
            now.next = bef;
            bef = now;
        }
        ListNode res = head;
        while(len>0)
        {
            len = len-1;
            ListNode tmp = res.next;
            if(bef==null)
            {
                res.next = null;
                break;
            }
            else
            {
                res.next = new ListNode(bef.val);
                res = res.next;
                bef = bef.next;
            }
            if(len!=0)
            {
                res.next = tmp;
                res = res.next;
            }

        }
        return ;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值