首页 > 其他分享 >[代码随想录]Day03-链表part01

[代码随想录]Day03-链表part01

时间:2023-07-28 22:22:04浏览次数:43  
标签:index ListNode cur Day03 元素 随想录 next 链表 Next

题目:203. 移除链表元素

思路:

20210316095619221

做链表首先最好有个虚拟头指针,这样做删除添加操作的时候可以统一操作否则还得特判。

那删除元素的过程,从虚拟头指针开始要做以下几步:

  1. 如果当前p的next不为空,那么就可以进行判断
  2. 如果p的next的值是val(↑p的next不为空↑),那么就把p的next修改为p的下一项(p.next)的next,具体可以参考上图
  3. 如果p的next的值不是val,那p = p.next继续向后遍历

因为我要维护的是p以及p的下一项p.next,所以当删除后p.next已经变成了先前的p.next.next所以p本身不需要移动;没有删除的话p需要移动。

代码:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeElements(head *ListNode, val int) *ListNode {
    res := new(ListNode) // 创建一个*ListNode
    res.Next = head // 作为虚拟头指针
    p := res
    for p.Next != nil{ // 下一项不为空继续
        if p.Next.Val == val { // 如果下一项要删除
            p.Next = p.Next.Next // 把这一下的next改为下一项(p.next)的next
        } else {
            p = p.Next // 下一步
        }
    }
    return res.Next // res是虚拟头,res.Next才是结果
}

题目:707. 设计链表

思路:

究极整合题,核心内容就是如何使用这个虚拟头节点,值得推敲的一道题(毕竟把很多内容全用了)。

代码:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
type MyLinkedList struct {
    head *ListNode
    size int // 记录长度
}

func Constructor() MyLinkedList {
    return MyLinkedList{&ListNode{},0}
}


func (this *MyLinkedList) Get(index int) int {
    if index <0 || index >= this.size {
        return -1
    }
    cur := this.head // 虚拟头
    for i := 0; i <= index; i++ { 
        cur = cur.Next
    }
    return cur.Val
}


func (this *MyLinkedList) AddAtHead(val int)  {
    this.AddAtIndex(0, val) // 直接使用现成的插入
}


func (this *MyLinkedList) AddAtTail(val int)  {
    this.AddAtIndex(this.size, val) // 直接使用现成的插入
}


func (this *MyLinkedList) AddAtIndex(index int, val int)  {
    if index > this.size {
        return
    }
    if index < 0 {
        index = 0
    }
    this.size++
    cur := this.head
    for i:=0; i < index; i++ {
        cur = cur.Next
    }
    tmp := &ListNode{val,cur.Next}
    cur.Next = tmp
}


func (this *MyLinkedList) DeleteAtIndex(index int)  {
    if index < 0 || index >= this.size {
        return
    }
    this.size--
    cur := this.head
        for i:=0; i < index; i++ {
        cur = cur.Next
    }
    cur.Next = cur.Next.Next
}


/**
 * Your MyLinkedList object will be instantiated and called as such:
 * obj := Constructor();
 * param_1 := obj.Get(index);
 * obj.AddAtHead(val);
 * obj.AddAtTail(val);
 * obj.AddAtIndex(index,val);
 * obj.DeleteAtIndex(index);
 */

题目:206. 反转链表

思路:

说是双指针其实有三个只是由其中一个能直接得到。

三个指针l、r、t分别代表前一个元素,当前元素,以及下一个元素,那么翻转的步骤如下:

  1. 让当前元素指向前一个元素r.Next = l
  2. 把上一个元素更新为当前元素l = r
  3. 把当前元素更新为下一个元素r = t

需要注意的几个问题:

  1. 要把第一个元素的next改为nil
  2. 结束时r == nil,因此我们返回的是上一个元素l而不是当前元素r

代码:

双指针

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    var l *ListNode // 左初始nil
    r := head // 中
    for r != nil {
        t := r.Next // 右
        r.Next = l
        l = r
        r = t
    }
    return l
}

标签:index,ListNode,cur,Day03,元素,随想录,next,链表,Next
From: https://www.cnblogs.com/wtcsky/p/17589022.html

相关文章

  • 代码随想录算法训练营第三天| LeetCode 203.移除链表元素(同时也对整个单链表进行增删
    203.移除链表元素      题目链接/文章讲解/视频讲解::https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A8%E5%85%83%E7%B4%A0.html    卡哥题目建议:本题最关键是要理解虚拟头结点的使用技巧,这个对链表题目很重要。   做题思路:   ......
  • 数据结构之带头节点的单链表增删改查操作实现
     单链表的定义什么是单链表   单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。   单链表的各个数据元素在物理上可以是离散存放的,每个结点除了存放数据元素外,还要存储指向下一个节点的指针。而顺序表是连续存放的,每个结点中只......
  • 链表/栈/队列/KMP
    链表用数组模拟,不同于结构体加指针调用new关键字开上万级别的节点非常慢,基本会超时单链表来构造邻接表用于存图与树基本结构:head表示头结点的下标e[i]表示节点i的值ne[i]表示节点i的下一个节点的下标idx存储当前已经用到了哪个节点,表示新节点基本操作:......
  • 代码随想录算法训练营第四十天| 300.最长递增子序列 674. 最长连续递增序列 718.
    300.最长递增子序列要求:可以删减任意个节点,最后保存最大的递增长度难点:410489如何保证全局的视角,看到很前面的节点是否大于当前的节点,而不是仅仅记录状态思路:dp[n],当子序列的末尾为N时,它的最大子序列长度也就意味着,N在它的子序列中是最大的,遍历这个N之前的所有序......
  • 代码随想录算法训练营第二天| LeetCode 977.有序数组的平方 ,209.长度最小的子数组 ,59.
    977.有序数组的平方     题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/    文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html    视频讲解: https://www.bili......
  • 单链表查找与删除
    单链表是一种常见的数据结构,它由一系列的节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。在单链表中,查找和删除节点是常见的操作。1.单链表查找:要查找单链表中的一个节点,需要从链表的头节点开始,沿着指针依次遍历每个节点,直到找到目标节点或者到达链表的末尾(即指针......
  • [代码随想录]Day02-数组part02
    题目:977.有序数组的平方思路:一开始的思路是从中间向两边扩:找到第一个大于等于0的位置r;判断nums[r]是否大于等于0,如果不是赋值为len(nums)表示不在范围内了。l的位置在r的左侧因此l=r-1只要l>=0或者r<len(nums)满足一个就可以继续;遍历时要保证数组不能越界说实话维护......
  • 数据结构练习笔记——求解由单链表表示的一元多项式的值
    求解由单链表表示的一元多项式的值【问题描述】一个形如\[a_0x^0+a_1x^1+...+a_nx^n\]的一元多项式含有n+1项,每一项由系数和指数唯一确定,可表示成由系数项和指数项构成的一个二元组(系数,指数),一元多项式则可以表示成二元组的集合{(a0,0),(a1,1),(a2,2)...(an,n)},可看成是数据......
  • day03课程回顾
    课程回顾进制十进制转换二进制十进制数除以2倒取余数二进制转换十进制二进制转换八进制从低位次开始三位一组,如果最高位不足三位补0,将每一组三位二进制转换为八进制八进制转换二进制一个八进制数转换成三个二进制数,不足的位次补0二进制转换十六进制从低位次......
  • [代码随想录]Day01-数组part01
    题目:704.二分查找思路:二分查找一般是在有序的数组中查找指定的值,单纯的查找值,把数组跑一遍的复杂度为O(n)。二分查找每次把范围缩小一半,我们每次都去中间的值,有以下三种情况:如果mid位置的值比target大,那么target应该在mid左侧的位置(由小到大排序情况下)如果mid位置的值比t......