将给定的单链表 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
}
}