[LeetCode]Reorder List

题目描述

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

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

For example,
Given {1,2,3,4}, reorder it to {1,4,2,3}.

对已有列表进行重排,使之按照 L 0 L n L 1 L n-1 L 2 L n-2 →…的顺序排列。

解题思路

为了达到上述目标,我们采取以下策略:

  1. 获取列表长度len,计算得到尾部需要插入头部链表的长度为len/2;
  2. 得到头部链表的末尾节点,通过此节点获取尾部链表的头节点halfHead;
  3. 反转尾部链表节点,即以第2步获取的halfHead节点为头节点的链表;
  4. 将反转后的链表按序插入到头部链表的相邻节点中间;
  5. 结束,得到了重排后的链表。

代码

public  void reorderList(ListNode head) {
		ListNode node = head,halfHead = head,tempNode1,tempNode2;
		int len = 0, halfLen;
		if (node == null || node.next == null || node.next.next == null) {
			return;
		}

		while (node != null) {
			node = node.next;
			len++;
		}

		halfLen = len / 2;//得到需要重排节点的个数

		node = head;
		for (int i = 0;i < len - halfLen - 1; node = node.next, i++) {
		}
		halfHead = node.next;//得到尾部需插入头部节点的链表头
		node.next = null;
		
		node = head;
		ListNode reversehalfHead = reverseList(halfHead);//逆转链表
		
		//插入链表前部
		for(int i = 0;i < halfLen;i++){
			tempNode1 = node.next;
			tempNode2 = reversehalfHead.next;
			node.next = reversehalfHead;
			reversehalfHead.next = tempNode1;
			reversehalfHead = tempNode2;
			node = tempNode1;
		}	
	}

逆转链表的子函数:
public  ListNode reverseList(ListNode head) {
		ListNode node = head,lastNode = head,tempNode;
		if(node==null || node.next==null)
			return node;
		node = node.next;
		lastNode.next = null;
		while(node!=null){
			tempNode = node.next;
			node.next = lastNode;
			lastNode = node;
			node = tempNode;
		}
		return lastNode;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值