代码随想录复习 707设计链表 翻转链表,两两交换节点

news/2024/11/28 5:44:03/

代码如下 

type Node struct {    //定义一个节点 ,包含一个数据变量一个指针 

      Val int 

      Next *Node

}

type MyLinkedList struct {  //定义一个链表 ,链表里面有一个虚拟头节点,和大小 

     Dummayhead *Node 

     Size int 

}


 

func Constructor() MyLinkedList { //初始化 :创建一个虚拟头结点,指针域为空,数值域为-1 大小为 0  

      dummayhead := &Node{

          Val : -1 ,

          Next : nil ,

      }

      return MyLinkedList{Dummayhead:dummayhead,Size:0}

}


 

func (this *MyLinkedList) Get(index int) int {  //返回索引对应的值,思路;首先判断索引合不合法 

因为链表长度为size,所以链表节点对应的下标是从0 到size-1 ,如果超出这个范围则不合法  

        if index < 0 || index > this.Size-1 {

            return -1

        }

        cur := this.Dummayhead   //开始遍历,定义一个遍历指针指向虚拟头结点 

        for i := 0 ; i <= index  ; i++ {  //一直向后移动直到index处

            cur = cur.Next 

        }                                  //结束循环时,cur指向index节点 

        return cur.Val

}


 

func (this *MyLinkedList) AddAtHead(val int)  {  在头部添加元素 

          var newnode *Node = &Node{  // 先定义一个节点 

              Val : val ,

              Next : nil ,

          }

          newnode.Next = this.Dummayhead.Next   //虚拟头结点的next指针赋值给新创建节点的next指针,目的是让新创建的指针指向原本链表的头节点,那么新创建的节点就会成为新的头结点 

          this.Dummayhead.Next = newnode  //虚拟头节点在指向这个新创建的节点 

          this.Size++  //最后链表长度加1 

}


 

func (this *MyLinkedList) AddAtTail(val int)  {   //在尾部添加一个节点 

             var newnode *Node = &Node{

              Val : val ,

              Next : nil ,

          }

        cur := this.Dummayhead   //定义一个遍历指针  

        for cur.Next != nil {          //只要该节点的下一个节点不为空,则一直向后遍历   

              cur = cur.Next 

        }

        cur.Next = newnode 

        this.Size++ 

}


 

func (this *MyLinkedList) AddAtIndex(index int, val int)  {  //在index处添加一个节点  

              if index > this.Size {                        //判断index是否合法 

                  return

              }else if index == this.Size {  //如果index等于size,则说明需要队尾添加一个元素,所以直接调用队尾添加元素函数 

                  this.AddAtTail(val)

                  return 

              }else if index < 0 {  

                  index = 0 

              }

              cur := this.Dummayhead   //定义一个遍历指针 

              for i := 0 ; i <= index-1 ; i++ { //这时候需要遍历到index前一个节点 

                  cur = cur.Next

              }

              var newnode *Node = &Node {   //定义一个节点 

                  Val : val ,

                  Next : nil ,

              }

              newnode.Next = cur.Next   //cur的next指针赋值给新定义节点的next指针 

              cur.Next = newnode  //在将cur的next指针域指向新的节点 

              this.Size++ 

}


 

func (this *MyLinkedList) DeleteAtIndex(index int)  {

                if index < 0 || index > this.Size - 1 {

                    return 

                }

                 cur := this.Dummayhead 

                 for i := 0 ; i <= index-1 ; i++ {   //遍历到目标节点的前一个节点 

                     cur = cur.Next

                 }

                 cur.Next = cur.Next.Next  //直接将目标节点的下一个节点赋值给当前遍历到的节点的next指针域   

                 this.Size-- 

}

206 翻转链表 

代码如下  思路如下 :设置两个指针 

pre指针最开始指向空,cur指向头结点,然后将cur直接指向pre,在将cur向后移动,这样做之后,所有的节点都会指向自己的前一个节点,那么在前面的节点就会变为在后面的节点  

func reverseList(head *ListNode) *ListNode {

        var pre *ListNode 

        cur := head 

        

        for cur != nil {

        tmp := cur.Next

        cur.Next = pre 

        pre = cur 

        cur = tmp 

        }

        return pre 

        

}

24 两两交换链表中的节点 

代码如下

注: 这题需要画图,我不知道如何用文字清晰的表达  

/**

 * Definition for singly-linked list.

 * type ListNode struct {

 *     Val int

 *     Next *ListNode

 * }

 */

func swapPairs(head *ListNode) *ListNode {

          dummy := &ListNode{

              Next : head ,

          }

          pre := dummy 

          for head != nil && head.Next != nil {

              tmp := head.Next.Next 

              pre.Next = head.Next 

              head.Next.Next = head 

              head.Next = tmp 

              pre = head 

              head = tmp 

          }

          return dummy.Next

}


http://www.ppmy.cn/news/62866.html

相关文章

5月7日 2H55min|5月8日8H50min|时间轴复盘|14:00~14:30

5月8日 todo list list4 40min ✅ |实际上用了50+50 list6 40min ✅ |实际上用了30+60 阅读+听力连做 100min ✅ 口语 day01 ✅ 口语 day02 口语 day03

Vmware虚拟机问题解决方案

Vmware虚拟机问题解决方案 1. 运行虚拟机系统蓝屏 可能的原因有两个: 1). 虚拟机所在磁盘的空间不足 ; -------> 清理磁盘空间 。 2). 操作系统版本高, 需要适配新版本的Vmware ; ------> 卸载Vmware15版本, 安装Vmware16版本 。 2. 卸载Vmware步骤 1). 卸载已经安…

【Java】字符串模板拼接的方法

引 在Java中&#xff0c;构建字符串是非常常见的操作。在很多时候&#xff0c;我们都需要使用变量或输入来定制一个文本输出&#xff0c;例如打印日志、生成HTML代码或构建错误消息。而当需要进行字符串连接时&#xff0c;字符串模板是一种常用的方法。在本篇博客中&#xff0…

lua | 数组与迭代器的使用

目录 一、数组 一维数组 多维数组 二、迭代器 泛型for迭代器 无状态的迭代器 多状态的迭代器 本文章为笔者学习分享 学习网站&#xff1a;Lua 基本语法 | 菜鸟教程 一、数组 数组&#xff1a;相同数据类型的元素按一定顺序排列的集合&#xff0c;可以是一维数组和多维数…

适用于Win和Mac的专业电脑数据恢复软件EasyRecovery易恢复14

EasyRecovery易恢复一键轻松找回丢失数据 支持电脑、相机、移动硬盘、U盘、SD卡、内存卡、光盘、本地电子邮件和 RAID 磁盘阵列等各类存储设备的数据恢复。EasyRecovery还可以支持恢复从硬盘、光盘、U盘、数码相机、手机等各种设备中恢复被删除或丢失的文件&#xff0c;只是使用…

2023.03青少年机器人技术等级考试理论综合试卷(五级)

2023年3月青少年机器人技术等级考试理论综合试卷&#xff08;五级&#xff09; 一、单选题(共 20 题&#xff0c;共 80 分) 1. 0x35 & 7 的结果是&#xff1f;&#xff08;A &#xff09; A. 5 B. 55 C. 50 D. 54 2.一般状况下&#xff0c;关于主控板的工作电压&#xff0c…

《Netty》从零开始学netty源码(五十四)之PoolThreadLocalCache

PoolThreadLocalCache 前面讲到PoolThreadCache&#xff0c;它为线程提供内存缓存&#xff0c;当线程需要分配内存时可快速从其中获取&#xff0c;在Netty中用PoolThreadLocalCache来管理PoolThreadCache&#xff0c;它的数据结构如下&#xff1a; PoolThreadLocalCache相当…

Spring02-Spring注解的使用、基于注解的IOC、纯注解配置、整合Junit、AOP入门、基于配置文件的AOP、切入点表达式、基于配置的文件环绕通知

Spring注解的使用 一、项目注解 和 XML 的选择问题 学习基于注解的 IOC 配置&#xff0c;即注解配置 和 XML 配置要实现的功能都是一样的&#xff0c;都是要降低程序间的耦合。只是配置的形式不一样。关于实际的开发中到底使用xml还是注解&#xff0c;每家公司有着不同的使用…