复习Day05:链表part01:203.移除链表元素、707.设计链表、206.反转链表、234. 回文链表

这篇具有很好参考价值的文章主要介绍了复习Day05:链表part01:203.移除链表元素、707.设计链表、206.反转链表、234. 回文链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

之前的blog链接:https://blog.csdn.net/weixin_43303286/article/details/131700482?spm=1001.2014.3001.5501

我用的方法是在leetcode再过一遍例题,明显会的就复制粘贴,之前没写出来就重写,然后从拓展题目中找题目来写。辅以Labuladong的文章看。然后刷题不用CLion了,使用leetcode自带模拟面试环境。

今天开始链表章节的复习了,不能在数组花太长时间,后面还有专门的双指针和动态规划章节的复习,被归到数组章节中,到那时候再复习。

203. 移除链表元素

没什么好说的,删除值为val的节点,遍历一遍删就行了,注意设置虚拟头节点dummy,以及删除链表的操作C++是delete p。

707.设计链表

涵盖了链表的一系列相关操作,包括数据结构的设计:

class MyLinkedList {

public:  
struct ListNode{  
int val;  
ListNode* next;  
ListNode(int x):val(x),next(NULL){};//构造函数  
};  
//初始化链表,  
MyLinkedList() {  
_dummy = new ListNode(0);  
_size = 0;  
}

这里注意有两个,一个是MyLinkedList类,一个是类中的数据结构ListNode,MyLinkedList()是初始化函数。

206.反转链表

这里使用双指针,用pre节点保存cur的前一个节点。(准确来说还有一个暂时的指针tmp用来保存cur的后一个节点)

(思路很清晰,还是还是记不住,还是要多刷刷,链表的题目就是思路简单但像做出来就ac很难)

234. 回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

 

示例 1:


输入:head = [1,2,2,1]
输出:true
示例 2:


输入:head = [1,2]
输出:false

之前有做过判断回文串的题目,但在这里不适用,使用的是双指针法,因为单向链表是不能倒着遍历的,因此考虑别的方法。

借助二叉树后序遍历的思路,不需要显式反转原始链表也可以倒序遍历链表

链表兼具递归结构,树结构不过是链表的衍生。那么,链表其实也可以有前序遍历和后序遍历

void traverse(ListNode* head) {
    // 前序遍历代码
    traverse(head->next);
    // 后序遍历代码
}

这个框架有什么指导意义呢?如果我想正序打印链表中的 val 值,可以在前序遍历位置写代码;反之,如果想倒序遍历链表,就可以在后序遍历位置操作:

/* 倒序打印单链表中的元素值 */
void traverse(ListNode* head) {
    if (head == NULL) return;
    traverse(head->next);
    // 后序遍历代码
    print(head->val);
}

但这种方法由于引入了栈,时间和空间复杂度都是O(N),还可以借助双指针先找到链表的中点,再进行反转比较,这里就不纠结细节了,具体代码如下,三刷再来看:

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        ListNode *fast = head, *slow = head;
        while(fast != nullptr && fast->next != nullptr){
            fast = fast->next->next;
            slow = slow->next;
        }
        if(fast != nullptr){//链表的长度为奇数
            slow = slow->next;
        }
        ListNode* left  = head;
        ListNode* right = reverse(slow);
        while (right != nullptr) {
        if (left->val != right->val)
            return false;
        left = left->next;
        right = right->next;
    }
    
        return true;


    }

    //反转链表的函数
    ListNode* reverse(ListNode* head) {
    ListNode* pre = nullptr;
    ListNode* cur = head;
    while (cur != nullptr) {
        ListNode* next = cur->next;
        cur->next = pre;
        pre = cur;
        cur = next;
    }
    return pre;
}
};

(可以看到这里的reverse函数和我们上一题的函数是一模一样的)

这里判断的条件为什么是while (right != nullptr) :因为left指向的是head,而right指向的是链表重点,因为肯定right短一些先到头,因此循环由right控制。文章来源地址https://www.toymoban.com/news/detail-730721.html

到了这里,关于复习Day05:链表part01:203.移除链表元素、707.设计链表、206.反转链表、234. 回文链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • day3_203移除链表元素_707设计链表_206反转链表

    链表是一种通过指针串联起的线性结构,每个节点由两部分组成: 一个数据域,一个指针域(存放指向下一节点的指针),最后一个节点的指针域指向null。 链表入口节点是头结点head。 双链表:两个指针域,指向下一节点和上一节点。( 向前向后查询) 循环链表:首尾相连

    2024年02月16日
    浏览(25)
  • day3-链表理论基础 203.移除链表元素 707.设计链表 206.反转链表

    单链表 双链表:每个节点有两个指针域,一个指向下一个节点,一个指向上一个节点 既可以查询前一个节点,又能查询后一个节点 循环列表:链表首尾相连 在内存上 不是连续分布 的,散乱分布在内存中的某地址上 删除节点:next指针直接指向下下个节点,且在内存中删除

    2024年02月04日
    浏览(25)
  • 代码随想录day3 | 203.移除链表元素 707.设计链表 206.反转链表

    直接让前一个节点指向后一个节点即可 两种方法 第一种:直接删除 第二种:头删的时候,直接 head=head-next 其实这两种方法都没有做到统一 第三种:虚拟头结点法 这样的话,咱们删除的时候,就是以统一的规则来进行删除啦! 203.移除链表元素 法一:原始删除法 1、while(h

    2024年02月16日
    浏览(28)
  • 【Leetcode60天带刷】day03链表——203. 移除链表元素,707.设计链表,206. 反转链表

    链表就像一串小火车,有一节一节的车厢,每个车厢都叫做一个节点。  单链表:每个链表车厢里有两个内容,一个放的是真正的数据,另一个放的是下一节车厢的编号。 双链表:每个链表车厢里有三个内容,一个真正数据,一个下一个车厢的编号,还有一个上一节车厢的编

    2024年02月06日
    浏览(35)
  • 【LeetCode题目详解】 203. 移除链表元素707. 设计链表206. 反转链表 day3(补)

    题意:删除链表中等于给定值 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 输出:[] 看到这道题就想到了链表 这道题有两种写法,涉及如下链表操作的两种方式: 直接使用

    2024年02月16日
    浏览(31)
  • 代码随想录Day3|链表理论基础|203.移除链表元素|707.设计链表|206.反转链表

    虽然以前写过一次链表,但是真的已经忘得一干二净了 链表 :通过 指针 串联在一起的线性结构,每个 节点 都由数据域和指针域组成。 指针域 :存放下一个节点的指针,最后一个节点的指针域指向null,也即空指针 head :链表的入口节点,也即链表的头节点 链表的类型 单

    2024年02月11日
    浏览(43)
  • 刷题日记 Day 3 : Leetcode 203 . 移除链表元素、Leetcode 707 . 设计链表、Lettcode 206 . 反转链表

    本篇文章 , 是在代码随想录 60 天编程挑战的基础上进行的题目讲解 参与链接在此 : https://programmercarl.com/other/xunlianying.html 大家好 , 这个专栏 , 给大家带来的是 60 天刷题强训 . 最令大家头疼的事就是刷题了 , 题目又臭又长又抽象 , 有的题读都读不懂 , 更别说做了 . 所以 , 这个

    2023年04月09日
    浏览(39)
  • 203.移除链表元素

    循环遍历整个链表 定义两个指针:prev,cur 如果cur是要删除的节点,prev-cur-next,然后free(cur) 但是注意每次都要新定义一个节点del,用来free,不影响原来的cur节点往下循环 更新cur和prev 但是需要注意如果删除的是头节点,就要特殊处理,画图带上指针,情况分析,一目了然。

    2024年01月22日
    浏览(34)
  • 算法刷题营【Day3】:: 链表篇:单链表结点删除思路:一题辨别哨兵结点的优势(删除有奇效):203. 移除链表元素

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:203. 移除链表元素 2. 题解参考 - - 2.1 方法一:原表操作(不含哨兵结点) - - 2.2 方法二:虚设哨兵结点辅助法 - - 2.3 方法三:递归法 3. 单链表结点删除思路 4. 方法思路点拨:原表操

    2024年02月06日
    浏览(36)
  • LeetCode 203. 移除链表元素

    给你一个链表的头节点  head  和一个整数  val  ,请你删除链表中所有满足  Node.val == val  的节点,并返回  新的头节点  。   (1)直接使用原来的链表来进行移除节点操作: (2)设置一个虚拟头结点在进行移除节点操作:

    2024年02月15日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包