将一个已知的单链表进行逆置运算,如(a1,a2,…,an)变为(an,…a2,a1)。
时间: 2023-06-12 18:07:11 浏览: 103
单链表的逆置
5星 · 资源好评率100%
可以使用迭代或递归的方式来实现单链表的逆置。
下面是迭代的实现方法:
```
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
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;
}
```
首先定义两个指针 `prev` 和 `curr`,`prev` 初始值为 `nullptr`,`curr` 初始值为 `head`。然后不断循环,每次将 `curr` 指向的节点的 `next` 指针指向 `prev`,然后将 `prev` 更新为 `curr`,`curr` 更新为 `curr->next`,直到 `curr` 为 `nullptr`。最后返回 `prev`,即为逆置后的单链表头节点。
下面是递归的实现方法:
```
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;
}
```
递归的结束条件是当链表为空或者只有一个节点时,直接返回该节点。否则,递归调用 `reverseList` 函数,将 `head->next` 作为参数传入,得到逆置后的新链表头节点 `newHead`。然后将 `head->next->next` 指向 `head`,将 `head->next` 置为 `nullptr`,最后返回 `newHead`。
阅读全文