如何创建整数单链表并拆分奇偶数值到独立奇偶链表并输出结果?
实现思路
- 第一步:先定义单链表节点类
ListNode,包含val存储整数值,next存储下一个节点的指针 - 第二步:遍历原始链表的每个节点,判断节点值的奇偶性:
- 若为奇数,尾插至奇数链表
- 若为偶数,尾插至偶数链表
- 第三步:拆分完成后需要把奇数链表、偶数链表的尾节点的
next置为None,避免出现环或者残留原始链表的后续节点 - 第四步:分别遍历两个结果链表,打印输出所有节点值
可运行参考代码(Python实现)
# 定义单链表节点类 class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next # 拆分奇偶链表的核心函数 def split_odd_even(head: ListNode) -> tuple[ListNode, ListNode]: # 用哑节点简化链表边界处理,不用单独判断头节点为空的情况 odd_dummy = ListNode() even_dummy = ListNode() odd_cur = odd_dummy even_cur = even_dummy current = head while current: if current.val % 2 == 1: # 奇数节点接入奇数链表 odd_cur.next = current odd_cur = odd_cur.next else: # 偶数节点接入偶数链表 even_cur.next = current even_cur = even_cur.next current = current.next # 两个链表尾节点next置空,避免残留引用 odd_cur.next = None even_cur.next = None return odd_dummy.next, even_dummy.next # 辅助函数:打印链表所有值 def print_linked_list(head: ListNode): res = [] current = head while current: res.append(str(current.val)) current = current.next print(" -> ".join(res) if res else "空链表") # 测试用例 if __name__ == "__main__": # 构建原始测试链表:1->2->3->4->5->6->7 nodes = [ListNode(i) for i in range(1, 8)] for i in range(len(nodes)-1): nodes[i].next = nodes[i+1] original_head = nodes[0] print("原始链表:") print_linked_list(original_head) odd_head, even_head = split_odd_even(original_head) print("\n拆分后奇数链表:") print_linked_list(odd_head) print("\n拆分后偶数链表:") print_linked_list(even_head)
关键注意点
- 用哑节点(哨兵节点)可以省去判断奇数/偶数链表是否为空的分支逻辑,代码更简洁不容易出边界错误
- 遍历完成后必须给两个结果链表的尾节点的
next赋值为None,否则如果原始链表最后一个节点是奇数,偶数链表的尾节点会仍然指向原始链表中的下一个节点,导致打印的时候出现多余节点甚至环 - 该实现时间复杂度为O(n),n为原始链表节点总数,仅需要遍历一次原始链表;空间复杂度为O(1),所有节点都是复用原始链表的节点,没有额外创建新节点,仅用了有限的指针变量
内容的提问来源于stack exchange,提问作者jrp25
相关产品推荐
相关产品推荐

