设计一个算法,实现单链表反转
时间: 2023-12-14 08:16:53 浏览: 29
单链表反转是一个经典问题,可以用迭代和递归两种方式来实现。
1. 迭代法
迭代法的思路是,从头节点开始,依次将每个节点的指针反转,直至将整个链表反转。具体步骤如下:
- 定义三个指针:prev、curr、next,分别表示当前节点的前一个节点、当前节点和当前节点的后一个节点。
- 初始化prev为nullptr,curr为头节点。
- 遍历链表,重复以下操作:
- 将next指针指向curr的下一个节点。
- 将curr的next指针指向prev。
- 将prev指向curr。
- 将curr指向next。
- 遍历结束后,将头节点指向prev。
下面是迭代法的代码实现:
```c++
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head;
while (curr != nullptr) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
```
2. 递归法
递归法的思路是,将整个链表分为两部分:第一个节点和剩余节点。假设剩余节点已经被反转,现在要将第一个节点加入到反转后的链表中。
具体步骤如下:
- 如果链表为空或只有一个节点,直接返回该链表。
- 递归反转剩余节点,得到新的头节点newHead。
- 将第一个节点的next指针指向空。
- 将newHead的尾节点与第一个节点相连。
- 返回newHead。
下面是递归法的代码实现:
```c++
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return head;
}
ListNode* newHead = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return newHead;
}
```