题目:
给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。
解法:
-
直接修改法:直接遍历每个节点
将节点next指向上一节点 -
递归法:当前节点和剩余节点的修改
递归修改除首节点外的其他节点
最后让修改好的节点接上首节点,首节点next赋空即可。
直接修改代码:
#include "pch.h"
#include<iostream>
using namespace std;
struct ListNode {
int value;
ListNode* next;
};
ListNode* ReverseListNode(ListNode* Node) {
if (Node == nullptr)return nullptr;
ListNode* node = Node;
ListNode* preNode = nullptr;
while (node != nullptr) {
ListNode* nextNode = node->next;
node->next = preNode;
preNode = node;
node = nextNode;
}
return preNode;
}
int main()
{
ListNode* p1 = new ListNode();
p1->value = 4;
p1->next = nullptr;
ListNode* p2 = new ListNode();
p2->value = 3;
p2->next = p1;
ListNode* p3 = new ListNode();
p3->value = 2;
p3->next = p2;
ListNode* p4 = new ListNode();
p4->value = 1;
p4->next = p3;
ListNode* t = ReverseListNode(p4);
cout << t->value;
}
递归代码:
#include "pch.h"
#include<iostream>
using namespace std;
struct ListNode {
int value;
ListNode* next;
};
ListNode* ReverseListNode(ListNode* Node) {
if (Node == nullptr)return nullptr;
if (Node->next == nullptr) return Node;
ListNode* nextListNode = ReverseListNode(Node->next);
Node->next->next = Node;
Node->next = nullptr;
return nextListNode;
}
int main()
{
ListNode* p1 = new ListNode();
p1->value = 4;
p1->next = nullptr;
ListNode* p2 = new ListNode();
p2->value = 3;
p2->next = p1;
ListNode* p3 = new ListNode();
p3->value = 2;
p3->next = p2;
ListNode* p4 = new ListNode();
p4->value = 1;
p4->next = p3;
ListNode* t = ReverseListNode(p4);
cout << t->value;
}
链表题记得画图思考
代码比较抽象!