前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指offer No.15 反转链表

剑指offer No.15 反转链表

作者头像
week
发布2022-11-26 11:00:17
1320
发布2022-11-26 11:00:17
举报
文章被收录于专栏:用户画像用户画像

一、题目描述

输入一个链表,反转链表后,输出新链表的表头。

示例1

输入:

代码语言:javascript
复制
{1,2,3}

返回值:

代码语言:javascript
复制
{3,2,1}

二、解题思路

思路一:递归

代码语言:javascript
复制
/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead==nullptr||pHead->next==nullptr){
            return pHead;
        }
        ListNode* newlist=ReverseList(pHead->next);
        pHead->next->next=pHead;
        pHead->next=nullptr;
        return newlist;
    }
};

思路二:遍历

初始化:3个指针 1)pre指针指向已经反转好的链表的最后一个节点,最开始没有反转,所以指向nullptr 2)current指针指向待反转链表的第一个节点,最开始第一个节点待反转,所以指向head 3)nextnode指针指向待反转链表的第二个节点,目的是保存链表,因为cur改变指向后,后面的链表则失效了,所以需要保存 接下来,循环执行以下三个操作 1)nextnode = current->next, 保存作用 2)current->next = pre 未反转链表的第一个节点的下个指针指向已反转链表的最后一个节点 3)pre = current, current = nextnode; 指针后移,操作下一个未反转链表的第一个节点 循环条件,当然是current != nullptr 循环结束后,current当然为nullptr,所以返回pre,即为反转后的头结点

代码语言:javascript
复制
/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        ListNode *pre=NULL;
        ListNode *current=pHead;
        while(current!=NULL){
            ListNode *nextNode=current->next;
            current->next=pre;
            pre=current;
            current=nextNode;
        }
        return pre;
    }
};

三、复杂度分析

时间复杂度:O(n), 遍历一次链表 空间复杂度:O(1)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目描述
  • 二、解题思路
  • 三、复杂度分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档