设计算法将一个带头结点的单链表 A 分解为两个具有相同结构的链表 B、C,其中 B 表的结点为 A 表中值小于零的结点,而 C 表的结点为 A 表中值大于零的结点(链表 A 中的元 素为非零整数,要求 B、 C 表利用 A 表的结点) 。写出完整代码
时间: 2024-10-07 19:08:41 浏览: 45
C++版本将两个有序链表合并为一个新的有序链表并返回原理及代码实现
这是一个经典的链表分割问题,可以采用双指针的方式来解决。首先,我们需要创建两个新的头节点 `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`,表示链表已经被成功分解为两个部分。
阅读全文