leetcode 143. Reorder List

本文详细介绍了LeetCode 143题的解决方案,该问题是2019年考研408中的一道算法题目。主要思路是找到链表中间节点,对后半部分进行逆序,再将两部分连接。具体步骤包括计算节点数量,处理奇偶长度的特殊情况,并确保在操作过程中保持链表完整。算法的时间复杂度为O(n),空间复杂度为O(1)。

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

2019考研408的一道算法题,很伤心,在这里把算法思路理一下,别的不多说,向前看。找出中间结点,然后将后半部分结点逆序,最后将前半部分和后半部分连接起来。第一次统计结点个数n,第二次遍历,遍历到中间结点时,处理奇数个数和偶数个数的情况,若是奇数个数,最中间的节点将是变换结果后的最后一个结点,将其标记下来。注意在遍历时要保持链表不断裂。时间复杂度O(n),空间复杂度O(1)。
参考代码:

//leetcode   143. Reorder List
    public static void reorderList(ListNode head) {
    	if(head==null||head.next==null||head.next.next==null)
    		return;
        int n=0;
        ListNode p = head;
        while(p!=null){
        	++n;
        	p = p.next;
        }
        int mid = n/2,t=0;
        p = head;
        while(p!=null&&t<mid-1){
        	p = p.next;
        	++t;
        }
        ListNode end = null;
        if(n%2==1){
        	end = p.next;   	
        	p = end.next;
        	end.next = null;
        }else{      	
        	p = p.next;
        }
        ListNode vmNode = new ListNode(0);
        while(p!=null){
        	ListNode next = p.next;
        	p.next = vmNode.next;
        	vmNode.next = p;
        	p = next;
        }
        vmNode = vmNode.next;
        ListNode head_now = new ListNode(0);
         p=head_now;
        while(mid!=0){
        	--mid;
        	ListNode a1 = head.next,a2=vmNode.next;//保存下一个结点,以防断链,在这个地方调试了好久才发现
        	p.next = head;
        	p = p.next;
        	p.next = vmNode;
        	p = p.next;
        	head = a1;
        	vmNode = a2;
        }
        p.next = end;
        head = head_now.next;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值