首页 > 编程语言 >算法--链表

算法--链表

时间:2022-09-04 20:55:23浏览次数:48  
标签:ListNode cur -- next 链表 算法 pHead 节点

 

 

 

方法一:构造链表

如果此类型的题出现在笔试中,如果内存要求不高,可以采用如下方法:
可以先用一个vector将单链表的指针都存起来,然后再构造链表。
此方法简单易懂,代码好些。

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
    if(pHead->next==NULL || pHead==NULL) return pHead; //首先判断是否为空
      vector<ListNode*>v; //创建一个数组
        while(pHead){ //把数据中的元素全部放入到数组中去
            v.push_back(pHead);
            pHead = pHead->next;
        }
        reverse(v.begin(), v.end());  //反转vector,也可以逆序遍历
        ListNode *head = v[0]; //指定第一个元素
        ListNode *cur = head; 
        for(int i=1;i<v.size();++i){ //构造链表
            cur->next = v[i]; //当前节点的下一个指针指向下一个节点
            cur = cur->next;//当前节点后移
        } //将数组的逆序之后的元素链接起来
        cur->next = nullptr; //最后一个节点指向为空
        return head; //返回列表
    }
};

  

方法二:正规解法

但是面试的时候,上一种解法当然不行。此题想考察的是:如何调整链表指针,来达到反转链表的目的。
初始化:3个指针
1)pre指针指向已经反转好的链表的最后一个节点,最开始没有反转,所以指向nullptr
2)cur指针指向待反转链表的第一个节点,最开始第一个节点待反转,所以指向head
3)nex指针指向待反转链表的第二个节点,目的是保存链表,因为cur改变指向后,后面的链表则失效了,所以需要保存
接下来,循环执行以下三个操作
1)nex = cur->next, 保存作用
2)cur->next = pre 未反转链表的第一个节点的下个指针指向已反转链表的最后一个节点
3)pre = cur, cur = nex; 指针后移,操作下一个未反转链表的第一个节点
循环条件,当然是cur != nullptr
循环结束后,cur当然为nullptr,所以返回pre,即为反转后的头结点
这里以1->2->3->4->5 举例:
图片说明
图片说明
图片说明
图片说明
中间都是重复步骤,省略了。。。


代码

 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Solution { public:     ListNode* ReverseList(ListNode* pHead) {         ListNode *pre = nullptr;         ListNode *cur = pHead;         ListNode *nex = nullptr; // 这里可以指向nullptr,循环里面要重新指向         while (cur) {             nex = cur->next;             cur->next = pre;             pre = cur;             cur = nex;         }         return pre;     } };

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

 

标签:ListNode,cur,--,next,链表,算法,pHead,节点
From: https://www.cnblogs.com/jerry-autumn/p/16656060.html

相关文章

  • CF1702G2 Passable Paths (hard version)
    PassablePaths(hardversion)给出一棵大小为\(n\)的树,\(q\)次询问,每次给出一大小为\(m\)的点集,判断是否存在一条链覆盖这些点,注意这条链可以经过其他点。\(n,\sum......
  • 2022-2023-1 20221408《计算机基础与程序设计》第一周学习总结
    班级:https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP作业链接:https://www.cnblogs.com/zhanquanchen/p/16654783.html作业目标:快速浏览教材作业正文:https://www.cn......
  • Typescript类型体操 - Tuple To Union
    题目中文实现泛型TupleToUnion<T>,它返回元组所有值的合集。例如typeArr=['1','2','3']typeTest=TupleToUnion<Arr>//expectedtobe'1'|'2'|'3'Eng......
  • labuladong总结
    双指针技巧秒杀七道链表题目合并两个有序链表和链表的分解:前者使用一个指针去接收,使用两个指针去遍历;后者使用两个指针去接收,使用一个指针去遍历。两者的接收指针都是带头......
  • 天威视讯很幸运吃了一个涨停,躲过了天地板!
    讲一下最近买的几只票:天威视讯、盈方微、熊猫乳品、依米康、酒鬼酒天威视讯盈亏如下:买入逻辑:前几天有过涨停板,回调几天,资金流出(绿柱)比较少,所以第二天挂了比开盘价......
  • Git和gitee的使用(二、入门篇)
    一、准备工作Git的下载以及gitee的注册。Git下载链接:https://git-scm.com/downloads注:按照默认选项进行安装就ok。gitee官网:https://gitee.com/注:按照提示进行注册。......
  • 数组初始化
    memset(a,false,sizeof(a));//将bool型a数组初始化为false0x3f3f3f3f//INT_MAX的一半memset(a,0x3f3f3f3f,sizeof(a));//将a数组初始化为0x3f3f3f3fmemset(a,0,sizeo......
  • 注解
    注解Annotation     元注解meta-annotation(相当于自定义注解)元注解  target(value=)表示这个注解可以用在什么地方value可以传几个值ElementType.可以看源码......
  • #include<iomanip>
    doublea=91.2345;//setprecision(n)保留n位有效数组//保留小数需要加入fixedcout<<setw(4)<<setfill('-')<<1234<<endl;cout<<setw(4)<<setfill('-')<<2<<endl;co......
  • Flask 学习-45.Flask-RESTX 自定义参数校验和自定义错误内容 error_msg 使用
    前言在校验请求参数的时候,除了一些基本的required=True,type类型外,还会遇到一些校验,比如是否为空,字符串长度,以及一些自定义的参数规则。add_argument参数classArgumen......