> 文章列表 > leetcode每日一题:链表专题篇第一期(1/2)

leetcode每日一题:链表专题篇第一期(1/2)

leetcode每日一题:链表专题篇第一期(1/2)

leetcode每日一题:链表专题篇第一期(1/2)

😚一个不甘平凡的普通人,日更算法学习和打卡,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘
🤗专栏:每日算法学习
💬个人主页:个人主页

算法分类:链表
语言:java
题目来源:力扣
预期学习时间:两天
前言:我知道很难,但是今天多付出一点,明天就更轻松一些!!!加油🦅🦅🦅

往期栏目:
👉数组学习第一期🎯
👉数组学习第二期🎯

文章目录

  • 链表专题
    • 什么是链表?
    • 怎样去写?
    • 力扣题目专练
      • 203. 移除链表元素
        • 思路:
        • 示例代码
      • 206. 反转链表
        • 思路:
        • 示例代码`

链表专题

什么是链表?

链表是通过指针串联在一起的线性结构,每一个节点由两部分组成,一个数数据域,一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null,空值。

分类:单链表,双链表,循环链表
单链表:
leetcode每日一题:链表专题篇第一期(1/2)
双链表:
leetcode每日一题:链表专题篇第一期(1/2)
循环链表:
leetcode每日一题:链表专题篇第一期(1/2)
时间复杂度:
链表的长度可以是不固定的,可以动态增删,适合数量不固定,频繁增删,较少查询的场景。在插入删除是时间复杂度是O(1),在查询时是O(n)

怎样去写?

代码实现:

class ListNode{int val; //结点的值ListNode next; // 下一个结点public ListNode(){} //无参构造函数public ListNode(int val){ //节点构造函数this.val = val;}//节点的构造函数public ListNode(int val,ListNode next){this.val = val;this.next = next;}
}

链表操作的两种方式:
1.直接使用原来的链表进行操作
例如:在进行移除节点操作的时候,因为结点的移除都是通过前一个节点来进行移除的,那么我们应该怎么移除头结点呢,只需要将head头结点向后移动一格即可。
leetcode每日一题:链表专题篇第一期(1/2)
leetcode每日一题:链表专题篇第一期(1/2)

2.设置一个虚拟头结点进行操作
为了逻辑统一去移除节点,可以在head之前设置一个虚拟头结点,这样每个节点都可以通过相同的处理方式去移除了。
leetcode每日一题:链表专题篇第一期(1/2)

下面我们通过几个习题来进行练习和巩固基础吧!!!699

力扣题目专练

203. 移除链表元素

原题链接

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例 1:

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1
输出:[]

示例3:

输入:head = [7,7,7,7], val = 7
输出:[]

提示:

列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50

思路:

我们使用带虚拟头,即上面的第二种方式来进行移除元素。思路很简单,可以参考一下代码:多敲几遍,增加熟练度

示例代码

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeElements(ListNode head, int val) {if(head == null){return head;}ListNode dummy = new ListNode(-1,head);ListNode pre = dummy;ListNode cur = head;while(cur != null){if(cur.val == val){pre.next = cur.next;}else{pre= cur;}cur= cur.next;}return dummy.next;}
}

206. 反转链表

原题链接

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

leetcode每日一题:链表专题篇第一期(1/2)
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

leetcode每日一题:链表专题篇第一期(1/2)
输入:head = [1,2]
输出:[2,1]

示例3:

输入:head = []
输出:[]

提示:

链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000

思路:

如何将链表指向反过来,只需要将该节点的下一个指向该节点前一个节点即可,此时我们仍使用虚拟头结点,用一个while循环,当当前节点是空的时候,返回该节点前一个节点即可。原来的尾结点成了翻转后的头节点,所以可以正常打印出链表。

示例代码`

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseList(ListNode head) {ListNode pre= null;ListNode cur= head;ListNode temp = null;while(cur!= null){temp = cur.next;cur.next= pre;pre = cur;cur = temp;}return pre;}
}

这两个题是最基础的链表入门题,相关的题目还有很多,建议多写几遍去理解一下实现过程和写法。
leetcode每日一题:链表专题篇第一期(1/2)

我是不想摆烂的 今天也要向佬学习码字不易,感谢您的阅读,希望对您有所帮助。关注我,完成每日算法自律打卡,学习什么时候开始都不晚!!

军工股票