返回

不留痕迹的解决链表的灵魂拷问

前端

链表灵魂拷问之一:分隔链表

题目背景

现在,你被告知需要将链表分成两个部分,一部分包含所有奇数节点,另一部分包含所有偶数节点。重新排列后,奇数节点和偶数节点应保持原有顺序。请返回重新排列后的链表。

解决策略

  1. 明确任务目标 :理解题目的要求,明确需要将链表分成奇数节点和偶数节点两个部分,并且保持原有顺序。
  2. 建立中间节点 :使用两个虚拟节点分别作为奇数节点和偶数节点链表的头节点,方便后续链表节点的连接。
  3. 循环遍历原链表 :遍历原链表,逐个判断当前节点是否为奇数或偶数,并将它们分别连接到奇数节点和偶数节点链表中。
  4. 连接两个链表 :完成节点连接后,将奇数节点链表的尾节点连接到偶数节点链表的头节点,形成一个完整的链表。

代码实现

def oddEvenList(head):
    # 创建虚拟节点
    odd_dummy = ListNode(0)
    even_dummy = ListNode(0)
    # 指向奇数链表和偶数链表的头节点
    odd, even = odd_dummy, even_dummy

    # 遍历原链表
    while head:
        # 如果是奇数节点
        if head.val % 2 == 1:
            # 将其添加到奇数链表
            odd.next = head
            odd = odd.next
        # 否则,添加到偶数链表
        else:
            even.next = head
            even = even.next
        # 指向下一个节点
        head = head.next

    # 连接奇数链表和偶数链表
    odd.next = even_dummy.next
    return odd_dummy.next

链表灵魂拷问之二:复制带随机指针的链表

题目背景

给定一个链表,其中每个节点包含一个整数值和一个指向另一个节点的随机指针。复制链表并返回复制后的链表,该链表应保留其所有值和相同随机指针的指向。

解决策略

  1. 分步解决问题 :首先将链表的每个节点复制一遍,使其成为一个带有原节点和新节点配对的链表。然后建立随机指针的连接,确保新节点的随机指针指向新链表中对应的节点。最后分离原节点和新节点,形成独立的两个链表。
  2. 利用哈希表 :为了更有效地建立新节点的随机指针连接,可以使用哈希表来存储原节点和新节点之间的对应关系,这样就可以在常数时间内快速访问新节点。

代码实现

def copyRandomList(head):
    # 创建一个哈希表存储原节点和新节点的对应关系
    hashmap = {}

    # 复制链表的节点
    new_head = ListNode(head.val)
    hashmap[head] = new_head

    # 遍历原链表
    current = head
    new_current = new_head
    while current.next:
        # 复制下一个节点
        new_current.next = ListNode(current.next.val)
        # 将新旧节点之间的对应关系添加到哈希表
        hashmap[current.next] = new_current.next
        # 指向下一个节点
        current = current.next
        new_current = new_current.next

    # 建立随机指针的连接
    current = head
    new_current = new_head
    while current:
        # 通过哈希表获取原节点的随机指针对应的节点
        new_current.random = hashmap[current.random]
        # 指向下一个节点
        current = current.next
        new_current = new_current.next

    # 分离原节点和新节点
    return new_head

通过对链表灵魂拷问的深入探索,我们掌握了更加有效的算法和策略,并提高了对链表相关问题的解决能力。无论是面试还是实际应用,这些技巧都能帮助我们从容应对复杂的数据结构难题。在未来的学习和工作中,继续深入探究数据结构和算法,不断精进技术水平,成就更卓越的自己。