如何以螺旋方式打印单链表?求有效实现方法
单链表螺旋遍历打印实现方案
核心思路
先将链表节点全部存入列表,利用列表的随机访问特性,通过双指针从首尾交替取元素,完美匹配螺旋遍历的需求:
- 遍历原链表,把所有节点(或节点值)存入列表
- 左指针从列表头部开始,右指针从尾部开始
- 交替取左、右指针指向的元素,直到左指针超过右指针为止
问题排查
你之前用ArrayList+双指针没成功,大概率是没处理好奇数长度链表的中间元素重复取的问题,或者循环条件设置错误(比如用left < right而非left <= right)。
代码实现(Python)
1. 定义链表节点类
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next
2. 螺旋打印实现(直接输出结果)
def spiral_print(head): # 把链表元素转存到列表 node_vals = [] current = head while current: node_vals.append(str(current.val)) current = current.next left, right = 0, len(node_vals) - 1 result = [] while left <= right: # 取左指针元素 result.append(node_vals[left]) left += 1 # 左右指针未重合时,取右指针元素 if left <= right: result.append(node_vals[right]) right -= 1 # 按要求格式输出 print(" -> ".join(result) + " -> X")
3. 测试示例
# 测试用例1:1->2->3->4->5->6 head1 = ListNode(1) head1.next = ListNode(2) head1.next.next = ListNode(3) head1.next.next.next = ListNode(4) head1.next.next.next.next = ListNode(5) head1.next.next.next.next.next = ListNode(6) spiral_print(head1) # 输出:1 -> 6 -> 2 -> 5 -> 3 -> 4 -> X # 测试用例2:1->2->3 head2 = ListNode(1) head2.next = ListNode(2) head2.next.next = ListNode(3) spiral_print(head2) # 输出:1 -> 3 -> 2 -> X
4. 进阶:构建螺旋顺序的新链表
如果需要直接生成螺旋顺序的链表而非仅打印值,可以用以下代码:
def spiral_build_new_list(head): nodes = [] current = head while current: nodes.append(current) current = current.next left, right = 0, len(nodes) - 1 dummy = ListNode(0) new_current = dummy while left <= right: new_current.next = nodes[left] new_current = new_current.next left += 1 if left <= right: new_current.next = nodes[right] new_current = new_current.next right -= 1 # 截断新链表的尾部,避免循环 new_current.next = None # 打印新链表验证 temp = dummy.next output = [] while temp: output.append(str(temp.val)) temp = temp.next print(" -> ".join(output) + " -> X")
内容的提问来源于stack exchange,提问作者techieadi4703
相关产品推荐
相关产品推荐

