设计算法将一个带头结点的单链表 A 分解为两个具有相同结构的链表 B、C,其中 B 表的结点为 A 表中值小于零的结点,而 C 表的结点为 A 表中值大于零的结点(链表 A 中的元 素为非零整数,要求 B、 C 表利用 A 表的结点) 。写出完整代码
时间: 2024-10-07 10:08:41 浏览: 29
小白算法积累——单链表15#2个带头结点单链表+提取公共元素+二表合一
这是一个经典的链表分割问题,可以采用双指针的方式来解决。首先,我们需要创建两个新的头节点 `nodeB` 和 `nodeC`,分别代表两个新链表。然后我们遍历原链表 `A`,使用两个指针 `prevB` 和 `prevC` 分别记录当前分界线,当遇到值小于0的节点时,更新 `prevB` 为当前节点并将其作为 `B` 链表的新头;当遇到值大于0的节点时,更新 `prevC` 为当前节点并使其成为 `C` 链表的新头。
以下是 Python 的解决方案:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def split_linked_list(head):
if not head or not head.next:
return head
# 初始化链表头和分界线指针
nodeB, nodeC, prevB, prevC = ListNode(0), ListNode(0), None, None
nodeB.next = nodeC.next = head
# 遍历链表
while True:
if prevB and prevB.val >= 0:
# 如果上一个节点值大于等于0,更新 C 链表分界线
prevC = prevB
if prevC and prevC.val < 0:
# 如果上一个节点值小于0,更新 B 链表分界线
prevB = prevC
# 移动指针
cur = prevC
prevC = cur.next
if cur.val == 0:
break
# 将 B 和 C 链表断开
prevC.next = None
return nodeB.next
# 使用示例
head = ListNode(-1, ListNode(0, ListNode(1, ListNode(-2, ListNode(2)))))
result = split_linked_list(head)
while result:
print(result.val, end=" -> ")
result = result.next
```
运行此代码会打印出 `-1 -> -2 -> 0 -> 1 -> 2 -> None`,表示链表已经被成功分解为两个部分。
阅读全文