首页 > 其他分享 >反转链表

反转链表

时间:2023-05-02 14:45:51浏览次数:34  
标签:ListNode 反转 next 链表 pHead 节点

  • 描述
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。   数据范围: 0≤n≤1000 要求:空间复杂度 O(1) ,时间复杂度 O(n) 。   如当输入链表{1,2,3}时, 经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。  
  • 示例1
输入:{1,2,3} 返回值:{3,2,1}  
  • 示例2
输入:{} 返回值:{} 说明:空链表则输出空    
  • 解法1
算法思想:采用链表的头插法来实现链表的逆置  
  • 解法2
算法思想:使用四个指针来进行链表的逆置,具体实现如代码注释。    
  • 代码 
 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6             val(x), next(NULL) {
 7     }
 8 };*/
 9 #include <cstdlib>
10 class Solution {
11 public:
12     ListNode* ReverseList(ListNode* pHead) {
13                 //解法一
14         //添加头结点
15         ListNode* p=(ListNode*)malloc(sizeof(ListNode));
16         p->next=nullptr;
17         //头插法
18         ListNode *q=pHead;
19         ListNode *r=q->next;
20         while(q){
21             r=q->next;//暂存q的下一节点
22             q->next=p->next;
23             p->next=q;
24             q=r;
25         }
26         return p->next;
27         //解法二
28         // //特殊情况判断
29         // if(pHead==nullptr) return pHead;
30         // //如例题,p,q记录节点1,2位置,r,s记录节点2,3位置
31         // ListNode *p=pHead;
32         // ListNode *q=p->next;
33         // ListNode *r=q;
34         // ListNode *s=r->next;
35         // pHead->next=nullptr;//头结点的next置空
36         // while(q){
37         //     //为节点2,3的反转做准备
38         //     r=q;
39         //     s=r->next;
40         //     //节点1,2反转
41         //     q->next=p;
42         //     //p,q又成为节点2,3的位置
43         //     p=r;
44         //     q=s;
45         // }
46         // return p;//最终p指向最后一个节点,q指向空
47     }
48 };

 

 

   

标签:ListNode,反转,next,链表,pHead,节点
From: https://www.cnblogs.com/yueshengd/p/17367597.html

相关文章

  • java反转部分链表后记
    由于链表只是一个单向链表所以不能在一次循环之内就直接进行反转操作又因为只需要反转部分链表所以只要将链表遍历到需要反转的最后一位,剩下的不用管了于是我想到了在第一遍循环中用HashMap获取需要反转的链表的部分,键代表下标,值代表原先链表中val之后第二遍遍历时按照将值按......
  • ds:单链表
    写在前边:单链表:1.带头结点的单链表:L头指针->头结点(data域不存数据元素,只指向下一个元素)->a1->a2->..->NULL2.不带头结点的单链表:L头指针->a1->a2...->NULL以上两种区别在于:无头结点的单链表在进行插入/删除元素时要对i=1的情况做特殊处理 一、带头结点的单链表基本操作#......
  • c语言实现链表的基本操作——初始化,求长度,添加节点,遍历输出
    #include<stdio.h>#include<stdlib.h>//创建结构体并命名typedefstructNode //typedef用于对struct的重命名{ inti; structNode*next;}LNode,*LinkList; //定义一个结构体指针//链表初始化boolInistList(LinkListL){ L=(LNode*)malloc(sizeof(LNo......
  • 链表
    手写双链表:#include<iostream>//链表节点结构体structListNode{intvalue;ListNode*prev;ListNode*next;ListNode(intv,ListNode*p=nullptr,ListNode*n=nullptr):value(v),prev(p),next(n){}};classLinkedList{public:Li......
  • 【数据结构】链式型存储结构-双向链表
    1 前言只要大家坐过火车,对于双向链表的理解就相当简单。双向链表就是在单链表的基础之上,为每一个结点增加了它的前继结点,我们来看看。2 双向链表双向链表的定义如下:typedefstructDaulNode{ElemTypedata;structDaulNode*prior;//前驱结点structDa......
  • 【数据结构】链式型存储结构-循环单链表
    1 前言对于单链表,由于每个结点只存储了向后的指针,到了尾部标识就停止了向后链的操作。也就是说,按照这样的方式,只能索引后继结点不能索引前驱结点。这样一来,不从头结点出发,这样就无法访问到全部结点。为了解决这个问题,我们只需要将单链表的尾结点的指针由空指针改为指向头结点......
  • 【数据结构】链式型存储结构-静态链表
    1 前言地球人都知道C语言是个伟大的语言,它的魅力在于指针的灵活性,使得它可以非常容易地操作内存中的地址和数据,这比其他高级语言更加灵活方便。(面向对象语言,比如java,可以使用对象引用机制间接地实现指针的某些功能)但是古人还是木有C语言丫,木有JAVA丫,只有原始的Basic,Fortran等......
  • 【数据结构】链式型存储结构-单链表
    1 前言线性表的链式存储结构的特点就是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以在内存中未被占用的任意位置。比起顺序存储结构每个元素只需要存储一个位置就可以了。现在链式存储结构中,除了要存储数据信息外,还要存储它的后继元素的存储地址(指针)。也就是说......
  • 坑系列 (Angular 2+ ) -> 控制反转C(Inversion of Control)和 依赖注入DI(Dependency
        控制反转IOC和依赖注入DI这两个概念其实有太多优秀的文章,由浅入深,从不同的角度,再到不同的比喻进行了讲解,对于新手的我来说,看完之后,好像看了又没完全看,回头摸索实践,还是总有种似懂非懂,懂了又没完全懂(‘X了又没完全XXX’句式是2021年某个梗嘻嘻......
  • c#-单链表
    namespaceMyLink;publicclassMyLinkedList{privateint_size{get;set;}publicclassMyTreeNode{publicintval{get;set;}publicMyTreeNodenext{get;set;}publicMyTreeNode(intval){this.val=val;......