Leetcode9.reorder List

Given a singly linked list L: L0L1→…→Ln-1Ln,
reorder it to: L0LnL1Ln-1L2Ln-2→…

You must do this in-place without altering the nodes' values.

For example,

given 1234 --> 1423

java:

package leetcode8.reorderList;

public class Solution {
	
	public static void reorderList(ListNode head){
		
		if (head==null || head.next==null)
			return;
		
		ListNode fast=head.next;
		ListNode slow=head;
		
		while(fast!=null && fast.next!=null){//找到中间节点,利用快慢指针
			fast=fast.next.next;
			slow=slow.next;
		}
		
		ListNode p=slow.next;//断链,翻转后半部分
		slow.next=null;
		ListNode pre=null;
		ListNode pcur=p.next;
		while(p!=null){
			pcur=p.next;
			p.next=pre;
			pre=p;
			p=pcur;
		}
		
		 ListNode l1 = head;    
	     ListNode l2 = pre; 
	     
	     while (l1 != null && l2 != null) {    
	        ListNode l1Next = l1.next;    
	        ListNode l2Next = l2.next;    
	        l1.next = l2;    
	        l2.next = l1Next;    
	        l1 = l1Next;    
	        l2 = l2Next; 
	    }
	}
	
}

 总结:思路如下:利用快慢指针找到中间节点,对中间节点的下一节点到末尾节点这一段翻转,从中间节点断链,对两段链进行合并即可,本题是对链表操作很综合的一个问题,对寻找链表的中间节点,翻转,合并要多看多写

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值