简单链表反转
单链表翻转
// 定义单链表节点结构
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
// 反转单链表函数
ListNode* reverseList(ListNode* head) {
ListNode* pre = nullptr;
ListNode* next = nullptr;
while (head != nullptr) {
next = head->next;
head->next = pre;
pre = head;
head = next;
}
return pre;
}
1. 节点结构定义:
在C++中,我们使用struct来定义单链表的节点结构。ListNode结构体包含一个int类型的成员变量val用于存储节点的值,以及一个指向ListNode的指针next用于指向下一个节点。
2. 反转函数:
• reverseList函数接受一个指向链表头节点的指针head作为参数。
• 初始化两个指针pre和next,pre初始化为nullptr,用于记录当前节点的前一个节点;next初始化为nullptr,用于暂存当前节点的下一个节点。
• 在while循环中,首先将head的下一个节点保存到next中,然后将head的next指针指向pre(实现反转),接着将pre更新为当前的head节点,最后将head更新为原来保存的next节点。
• 当循环结束时,pre指向的就是反转后的链表头节点,所以返回pre。
双链表反转
// 定义双链表节点结构
struct DoubleListNode {
int value;
DoubleListNode* last;
DoubleListNode* next;
DoubleListNode(int v) : value(v), last(nullptr), next(nullptr) {}
};
// 反转双链表函数
DoubleListNode* reverseDoubleList(DoubleListNode* head) {
DoubleListNode* pre = nullptr;
DoubleListNode* next = nullptr;
while (head != nullptr) {
next = head->next;
head->next = pre;
head->last = next;
pre = head;
head = next;
}
return pre;
}
1. 节点结构定义:
在C++中,DoubleListNode结构体定义了双链表的节点。它包含一个int类型的成员变量value用于存储节点的值,一个指向DoubleListNode的指针last用于指向前一个节点,以及一个指向DoubleListNode的指针next用于指向下一个节点。
2. 反转函数:
• reverseDoubleList函数接受一个指向双链表头节点的指针head作为参数。
• 初始化两个指针pre和next,pre初始化为nullptr,用于记录当前节点的前一个节点;next初始化为nullptr,用于暂存当前节点的下一个节点。
• 在while循环中,首先将head的下一个节点保存到next中,然后将head的next指针指向pre(实现正向指针的反转),接着将head的last指针指向原来保存的next节点(实现反向指针的反转),再将pre更新为当前的head节点,最后将head更新为原来保存的next节点。
• 当循环结束时,pre指向的就是反转后的双链表头节点,所以返回pre。