単独リンクリストLを考える:L0→L1→...→LN-1→Lnは、
その順序を変更:L0→Lnは→L1→LN-1→L2→LN-2→...
あなただけ自体を変更することができるノードは、リストのノードの値を変更することはできません。
例1:
所与1-> 2-> 3-> 4、そのリオーダー1-> 4-> 2-> 3。
例2:
所与1-> 2-> 3-> 4-> 5に、リオーダー1-> 5> 2-> 4-> 3。
プランこれを行うために、逆挿入順序をトラバースすることであり、基本的な時間計算量はO(N)であります
func reorderList(head *ListNode) {
if head == nil || head.Next == nil {
return
}
fast, slow := head, head
for fast.Next != nil && fast.Next.Next != nil {
fast = fast.Next.Next
slow = slow.Next
}
mid := slow.Next
slow.Next = nil
tail := mid
var preNode *ListNode = nil
for tail != nil {
n := tail.Next
tail.Next = preNode
preNode = tail
tail = n
}
//reverse
for head != nil && preNode != nil {
n := head.Next
head.Next = preNode
preNode = preNode.Next
head.Next.Next = n
head = n
}
}