重排链表
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
)
链接:https://leetcode-cn.com/problems/reorder-list
//重排单向链表
func reorderList(head *ListNode) {
mid := midNode(head)
l2 := reverseNode(mid.Next)
mid.Next = nil
merge(head, l2)
}
//获取链表中间节点
func midNode(head *ListNode) *ListNode {
//快慢指针
slow := head
fast := head
for fast.Next != nil && fast.Next.Next != nil {
slow = slow.Next
fast = fast.Next.Next
}
return slow
}
//反转链表
func reverseNode(head *ListNode) *ListNode {
var pre *ListNode = nil
cur := head
for cur != nil {
next := cur.Next
cur.Next = pre
pre = cur
cur = next
}
return pre
}
//合并链表
func merge(l1, l2 *ListNode) {
for l1 != nil && l2 != nil {
l1Tmp := l1.Next
l2Tmp := l2.Next
l1.Next = l2
l2.Next = l1Tmp
l1 = l1Tmp
l2 = l2Tmp
}
}