反转链表[C++版]

6 篇文章 0 订阅

问题描述

输入一个链表,反转链表后,输出新链表的表头。
举个栗子:
输入链表: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;
    }
};

我的总结

反转链表是基本操作,需要熟练掌握。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值