package main
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reorderListOld(head *ListNode) {
// Given a singly linked list L: L0→L1→…→Ln-1→Ln,
// reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
if head == nil || head.Next == nil {
return
}
stack := make([]*ListNode, 0)
beg := head
length := 0
for beg != nil {
stack = append(stack, beg)
beg = beg.Next
length++
}
beg = head
for i := 0; i < length/2; i++ {
tmp := beg.Next
beg.Next = stack[length-i-1]
beg.Next.Next = tmp
beg = tmp
}
beg.Next = nil
}
func reorderList(head *ListNode) {
if head == nil || head.Next == nil {
return
}
slow, fast := head, head
for fast != nil && fast.Next != nil {
// Find the middle of list
slow = slow.Next
fast = fast.Next.Next
}
// Reverse the 2nd part
var prev *ListNode
for slow.Next != nil {
tmp := slow.Next
slow.Next = prev
prev = slow
slow = tmp
}
slow.Next = prev
// Merge the 1st part and the 2nd part
left, right := head, slow
for left != nil && right.Next != nil {
tmpL, tmpR := left.Next, right.Next
left.Next = right
right.Next = tmpL
left, right = tmpL, tmpR
}
}
// func main() {
// n5 := ListNode{5, nil}
// n4 := ListNode{4, &n5}
// // n4 := ListNode{4, nil}
// n3 := ListNode{3, &n4}
// n2 := ListNode{2, &n3}
// n1 := ListNode{1, &n2}
// printList(&n1)
// reorderList(&n1)
// printList(&n1)
// }