12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- 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)
- // }
|