返回

巧夺天工:利用 Swift 重塑链表!

IOS

引言

在计算机科学的奇幻世界中,链表是一种古老而优雅的数据结构,它以其灵活性、可扩展性和无处不在性而闻名。然而,当我们面临重排链表的任务时,它却可能成为我们编码之旅中的一个拦路虎。但不要畏惧!今天,我们将挥舞 Swift 的魔杖,轻松破解这一难题,彻底重塑链表,释放其内在潜力。

拨开迷雾:探寻重排之路

重排链表并非易事,它要求我们不仅仅改变节点中的值,而是实际调换节点的位置。为了实现这一目标,我们将采取以下分而治之的策略:

  1. 寻找中间节点: 我们先用快慢指针法找到链表的中间节点。
  2. 反转后半部分: 我们从中间节点开始,将链表的后半部分反转。
  3. 合并链表: 最后,我们将原链表的前半部分和反转后的后半部分合并。

驾驭 Swift,巧妙重排

让我们踏上用 Swift 重排链表的激动人心的旅程:

func reorderList(head: ListNode?) {
    // 1. 寻找中间节点
    var slow = head
    var fast = head
    while fast != nil && fast!.next != nil {
        slow = slow!.next
        fast = fast!.next!.next
    }
    
    // 2. 反转后半部分
    var prev: ListNode? = nil
    var curr: ListNode? = slow!.next
    while curr != nil {
        let next = curr!.next
        curr!.next = prev
        prev = curr
        curr = next
    }
    slow!.next = prev
    
    // 3. 合并链表
    var l1 = head
    var l2 = prev
    while l2 != nil {
        let next1 = l1!.next
        let next2 = l2!.next
        l1!.next = l2
        l2!.next = next1
        l1 = next1
        l2 = next2
    }
}

详细剖析:层层递进

1. 寻找中间节点:

快慢指针法是一种巧妙的技术,它以不同的速度移动两个指针,快速指针每移动一步,慢指针就移动半步。当快指针到达链表末尾时,慢指针指向中间节点。

2. 反转后半部分:

反转链表本质上就是改变相邻节点之间的指向关系。我们从中间节点开始,将每个节点的 next 指向指向它的前一个节点,直到到达链表末尾。

3. 合并链表:

合并链表的关键是交替连接原链表的前半部分和反转后的后半部分。我们将原链表的前半部分的每个节点的 next 指向反转后链表的对应节点,然后反转后链表的对应节点指向原链表的下一个节点。这样交替进行,直到所有节点都合并在一起。