《leetcode-go》链表交替插入

将给定的单链表 L L: L0→L1→…→Ln−1→LnL0​→L1​→…→Ln−1​→Ln​
重新排序为:L0→Ln→L1→Ln−1→L2→Ln−2→…L0​→Ln​→L1​→Ln−1​→L2​→Ln−2​→…
要求使用原地算法,不能改变节点内部的值,需要对实际的节点进行交换。
例如:
对于给定的单链表{1,2,3,4},将其重新排序为{1,4,2,3}.

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 
 * @param head ListNode类 
 * @return void
*/
func reorderList( head *ListNode )  {
    // write code here
    //找到中间节点
	if head == nil || head.Next == nil {
		return
	}
    node := head
	fastNode := head.Next
	for fastNode != nil && fastNode.Next != nil {
		node = node.Next
		fastNode = fastNode.Next.Next
	}
	mid := node.Next
	node.Next = nil
	//反转后半部链表
	var pre *ListNode
	for mid != nil {
		tmp := mid.Next
		mid.Next = pre
		pre = mid
		mid = tmp
	}
	//合并两部分链表
	node = head
	for node != nil && pre != nil {
		tmp1 := node.Next
		tmp2 := pre.Next
		node.Next = pre
		pre.Next = tmp1
		node = tmp1
		pre = tmp2
	}
}

 

你可能感兴趣的:(leetCode-go)