C++实现反转链表的两种方法
在C++中,反转链表有两种常见的实现方法,分别是迭代法和递归法。
迭代法
迭代法解决链表反转问题的步骤如下:
- 创建三个指针:pre、current和next。
- 将当前节点的后继指针指向前一个节点,即
current->next = pre
。 - 将pre、current、next三个指针依次向左移动一个节点。
- 重复2、3步,直到遍历完整个链表。
迭代法的具体实现代码如下:
ListNode* reverseList(ListNode* head) {
ListNode* pre = nullptr;
ListNode* current = head;
ListNode* next = nullptr;
while (current) {
next = current->next;
current->next = pre;
pre = current;
current = next;
}
return pre;
}
递归法
递归法解决链表反转问题的步骤如下:
- 定义递归函数reverse(head),输入一个节点head,返回反转后的链表头。
- 当head为空节点或者head的后继节点为空节点时,直接返回head。
- 调用递归函数,传入head的后继节点,返回反转后的链表头。
- 将head节点的后继指针指向head节点的前一个节点。
- 返回反转后的链表头。
递归法的具体实现代码如下:
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) {
return head;
}
ListNode* newHead = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return newHead;
}
示例说明
以链表1->2->3->4->5为例,通过迭代法和递归法反转链表之后的结果如下:
- 迭代法:5->4->3->2->1
ListNode* reverseList(ListNode* head) {
ListNode* pre = nullptr;
ListNode* current = head;
ListNode* next = nullptr;
while (current) {
next = current->next;
current->next = pre;
pre = current;
current = next;
}
return pre;
}
- 递归法:5->4->3->2->1
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) {
return head;
}
ListNode* newHead = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return newHead;
}
通过以上两种方法,都可以实现链表的反转,具体选择哪种方法,可以根据需求灵活选择。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现反转链表的两种方法 - Python技术站