问题描述
输入一个链表,反转链表后,输出新链表的表头。
举个栗子:
输入链表:1->2->3->6->9
反转链表:9->6->3->2->1
输出:新链表的表头
解决思路
考虑到链表的性质,由若干节点链接起来组成的链表。
我们的链表p1可以写成:
1->2->3->6->9->nullptr
反转列表p2结果为:
9->6->3->2->1->nullptr
我们可以用依次插入的方式进行链表反转,控制每个节点的指针是关键吧。
我们可以访问原链表的表头,并令其指向nullptr,这一步操作的结果为:
p1:2->3->6->9->nullptr
p2:1->nullptr
这也是p2当前的组成。
我们令p1 = p1->next,这样一来,就相当于"抛弃"了p1的表头,然后再次访问p1的表头,并令其指向p2,这一步的结果为:
p1:3->6->9->nullptr
p2:2->1->nullptr
这也是p2当前的组成。
我们令p1 = p1->next,继续抛弃一个表头,再次访问新p1的表头,并令其指向p2,这一步的结果为:
p1:6->9->nullptr
p2:3->2->1->nullptr
继续上述操作,直到最后:
p1:空
p2:9->6->3->2->1->nullptr
我的代码
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* ReverseList(ListNode* p1) {
// p2为反转链表,初始化为nullptr
ListNode* p2 = nullptr;
// pNext为每次抛弃表头的p1指针
ListNode* pNext = nullptr;
// 当p1指针不为空时
while(p1){
// pNext保存抛弃表头的p1指针
pNext = p1->next;
// 构建现阶段的p2
p1->next = p2;
// 保存下来
p2 = p1;
// p1 更新为抛弃表头的p1
p1 = pNext;
}
return node;
}
};
我的总结
反转链表是基本操作,需要熟练掌握。