NOTE
重排链表
重排链表的 LeetCode 解题笔记。
这是历史学习笔记,可能存在过时或不完整的理解。
1. 题目描述
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换
2. 思路
拆分链表,反转后半段,合并
3. 实现
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reorderList(head *ListNode) {
if head == nil {
return
}
dummyHead := &ListNode{Next:head}
fast := dummyHead
slow := dummyHead
for fast != nil && fast.Next != nil {
slow = slow.Next
fast = fast.Next.Next
}
head1 := head
head2 := reverse(slow.Next)
slow.Next = nil
dummyHead.Next = nil
d := dummyHead
for head1 != nil && head2 != nil {
d.Next = head1
head1 = head1.Next
d = d.Next
d.Next = head2
head2 = head2.Next
d = d.Next
}
if head1 != nil {
d.Next = head1
}
if head2 != nil {
d.Next = head2
}
}
func reverse(head *ListNode) *ListNode {
var prev *ListNode
current := head
var next *ListNode
for current != nil {
next = current.Next
current.Next = prev
prev = current
current = next
}
return prev
}
讨论
使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看