C++ 单链表就地逆置算法详解:实现高效的链表反转
C++ 单链表就地逆置算法详解:实现高效的链表反转
问题描述:
给定一个带头结点的单链表,要求实现一个函数,将该链表就地(不增加额外结点)逆置。
函数接口定义:
void reverseList(LinkList La);
其中参数 La 是待逆置的链表,头指针为 head,指针域为 next。
思路:
- 首先判断链表是否为空,如果为空则直接返回。
- 定义三个指针变量 prev、curr 和 next,分别指向前一个结点、当前结点和下一个结点。
- 将 curr 指向头结点的下一个结点,prev 指向头结点,next 指向 curr 的下一个结点。
- 进入循环,将 curr 的指针域指向 prev,然后将 prev、curr 和 next 依次向后移动一位。
- 循环结束后,将头结点的指针域指向 prev,完成链表的逆置。
实现代码:
void reverseList(LinkList La) {
if (La.head->next == NULL) {
return;
}
LNode* prev = La.head;
LNode* curr = La.head->next;
LNode* next = curr->next;
curr->next = NULL;
while (next != NULL) {
prev = curr;
curr = next;
next = curr->next;
curr->next = prev;
}
La.head->next = curr;
}
代码解析:
- 首先判断链表是否为空,如果为空则直接返回。
- 定义三个指针变量 prev、curr 和 next,分别指向前一个结点、当前结点和下一个结点。
- 将 curr 指向头结点的下一个结点,prev 指向头结点,next 指向 curr 的下一个结点。
- 进入循环,将 curr 的指针域指向 prev,然后将 prev、curr 和 next 依次向后移动一位。
- 循环结束后,将头结点的指针域指向 prev,完成链表的逆置。
举例:
假设链表的初始状态为: 1 -> 2 -> 3 -> 4 -> NULL
则经过逆置后的链表状态为: 4 -> 3 -> 2 -> 1 -> NULL
总结:
该算法通过巧妙的指针操作,将链表元素顺序反转,实现了单链表的就地逆置,无需额外空间,提高了算法的效率。
原文地址: http://www.cveoy.top/t/topic/pbY6 著作权归作者所有。请勿转载和采集!