编写一个非递归程序以O(N)时间翻转单链表
时间: 2024-09-27 15:12:58 浏览: 35
手写单链表翻转(递归和非递归)
要编写一个非递归的O(N)时间复杂度的单链表反转程序,可以使用迭代的方式来实现,通过三个指针分别代表当前节点、前一个节点和下一个节点。以下是Python中的代码示例:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def reverseList(head):
prev = None # 初始化前一个节点为空
curr = head # 当前节点初始化为头节点
next_node = None # 初始化下一个节点为None
# 遍历链表,直到curr为None
while curr is not None:
# 将当前节点的next指向前一个节点
temp = curr.next
curr.next = prev
# 更新prev, curr和next_node
prev = curr
curr = temp
if temp is not None:
next_node = temp # 下一个节点变为temp(防止丢失)
# 返回新的头节点
return prev # 因为最后prev指向了原链表的尾部,也就是新链表的头
# 示例
# 假设链表:1 -> 2 -> 3 -> 4 -> 5
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)
reversed_head = reverseList(head)
```
这个程序遍历链表一次,每次修改当前节点的next指针将其指向前一个节点,实现了链表的反转。在迭代过程中,不需要额外的空间存储状态,所以空间复杂度是O(1)。
阅读全文