返回
不留痕迹的解决链表的灵魂拷问
前端
2023-11-22 21:18:04
链表灵魂拷问之一:分隔链表
题目背景
现在,你被告知需要将链表分成两个部分,一部分包含所有奇数节点,另一部分包含所有偶数节点。重新排列后,奇数节点和偶数节点应保持原有顺序。请返回重新排列后的链表。
解决策略
- 明确任务目标 :理解题目的要求,明确需要将链表分成奇数节点和偶数节点两个部分,并且保持原有顺序。
- 建立中间节点 :使用两个虚拟节点分别作为奇数节点和偶数节点链表的头节点,方便后续链表节点的连接。
- 循环遍历原链表 :遍历原链表,逐个判断当前节点是否为奇数或偶数,并将它们分别连接到奇数节点和偶数节点链表中。
- 连接两个链表 :完成节点连接后,将奇数节点链表的尾节点连接到偶数节点链表的头节点,形成一个完整的链表。
代码实现
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
链表灵魂拷问之二:复制带随机指针的链表
题目背景
给定一个链表,其中每个节点包含一个整数值和一个指向另一个节点的随机指针。复制链表并返回复制后的链表,该链表应保留其所有值和相同随机指针的指向。
解决策略
- 分步解决问题 :首先将链表的每个节点复制一遍,使其成为一个带有原节点和新节点配对的链表。然后建立随机指针的连接,确保新节点的随机指针指向新链表中对应的节点。最后分离原节点和新节点,形成独立的两个链表。
- 利用哈希表 :为了更有效地建立新节点的随机指针连接,可以使用哈希表来存储原节点和新节点之间的对应关系,这样就可以在常数时间内快速访问新节点。
代码实现
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
通过对链表灵魂拷问的深入探索,我们掌握了更加有效的算法和策略,并提高了对链表相关问题的解决能力。无论是面试还是实际应用,这些技巧都能帮助我们从容应对复杂的数据结构难题。在未来的学习和工作中,继续深入探究数据结构和算法,不断精进技术水平,成就更卓越的自己。