有一个线性表,其中,采用带头结点的单链表L存储,设计一个算法将其就地逆置。所谓“就地”是指辅助空间为O(1)。
时间: 2024-10-03 14:01:44 浏览: 36
JAVA单链表的简单操作(递增单链表插入数据,链表逆置,链表逆序合成)
为了就地逆置一个带头结点的单链表L,我们可以利用三个指针,分别表示当前节点、前一个节点和后一个节点。以下是算法步骤:
1. 初始化三个指针,将头节点赋给`prev`(即前一个节点),将头节点赋给`current`(当前节点)和`nextTemp`(临时下一个节点)。
2. 遍历链表直到`current`为空:
a. 将`current`的下一个节点赋给`temp`(保存原下一个节点)
b. 更新`current`的下一个节点为`prev`(逆转链接)
c. `prev`向前移动一位,变成`current`
d. `current`变成`temp`(继续处理下一个节点)
3. 当`current`变为NULL时,说明遍历结束,此时`prev`指向的就是新的头节点。
这个过程只用了常数级别的额外空间(因为只用到了临时变量`temp`),所以满足了“就地”的要求。下面是伪代码形式:
```
function reverseList(head):
prev = None
current = head
nextTemp = None
while current is not None:
nextTemp = current.next
current.next = prev
prev = current
current = nextTemp
# 如果链表非空,设置新头节点
if prev is not None:
head = prev
return head
```
阅读全文