首页 > 编程语言 >算法训练营第三天| 203.移除链表元素、707.设计链表、206.反转链表

算法训练营第三天| 203.移除链表元素、707.设计链表、206.反转链表

时间:2024-09-28 16:53:34浏览次数:3  
标签:pre 203 元素 cur after head next 链表 移除

203.移除链表元素

状态:完成

个人思路:首先令head符合条件,之后判断这个head是否为空,空的话返回空节点;非空的话继续进行。令pre=head;cur = head->next,只要cur非空,就判断cur的值的情况,如果需要删除,就改变pre->next和cur;如果不需要删除就继续检查下一个。

看完讲解视频之后的想法:我认为他的分析很有逻辑性,首先判断出对于头结点和非头结点的删除方式是不一样的。这样就有两种方法可以处理,第一种就是像我那样;分别处理;还有一种就是虚拟头结点方法,这样就可以统一处理了。我忘记释放了,记得c++要释放。

206.反转链表

状态:完成

个人思路:首先判断head是不是空节点,是的话直接返回就好了。如果不是,那么就要考虑一种算法能够涵盖三种情况,一种是只有一个元素,第二种是有两个元素,第三种是有三个及以上的元素。起初我的做法是:before是空指针,cur为head,如果cur->next为空,那么就是只有一个元素,直接返回头结点。然后令after = cur->next(因为之前已经检查过非空了,所以这里没问题),所以这里就是两个元素和多个元素的情况。这种情况下,while(cur),就移动,重点是after = after->next,因为进入的时候并没有判断after,所以可能after为空,然后在这里我加了一个条件,if(after->next),才after = after->next,但是这样会出现什么问题呢,我现在也不知道。

问题出在哪里?待解决。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return None
        pre = None
        cur = head
        nex = cur.next
        if not nex:
            return cur
        while(cur):
            cur.next = pre
            pre = cur
            cur = nex
            if(nex.next):
            
                nex = nex.next
        return pre

之后我在gpt的提示下自己想出了一种办法,就是首先判断head是不是空,是空节点就返回,不是的话,就赋值before和cur,然后while(cur.next),(不满足就return cur,和后边重合了,涵盖了只有一个元素的情况)满足就赋值after = cur.next 然后移动。当cur为最后一个元素的时候,循环被跳出,然后再额外令cur.next  = pre,最后还是返回cur;这样就把两个元素和多个元素情况统一了。这种方法我认为重点在于先检查while(cur.next),再赋值。

最后gpt告诉和看课我一种很神奇的方法,简洁优美,让我有很深刻的感触,我经常惯性上来就直接考虑特殊情况,实则或许可以先抓住核心考虑,然后再看满不满足特殊情况。

然后还有递归的方法可以实现,代码随想录中是根据双指针对应的递归,我觉得很厉害。

标签:pre,203,元素,cur,after,head,next,链表,移除
From: https://blog.csdn.net/xiaotaoooo/article/details/142601965

相关文章

  • 代码随想录算法训练营第三天 | 熟悉链表
    链表的存储方式数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。链表是通过指针域的指针链接在内存中各个节点。所以链表中的节点在内存中不是连续分布的,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。链表的定义template<typenameT>......
  • 力扣 简单 206.反转链表
    文章目录题目介绍题解题目介绍题解法一:双指针在遍历链表时,将当前节点的next改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。代码如下:classSolution{public......
  • 力扣 中等 92.反转链表 II
    文章目录题目介绍题解题目介绍题解classSolution{publicListNodereverseBetween(ListNodehead,intleft,intright){//创建一个哑节点,它的next指向头节点,方便处理ListNodedummy=newListNode(0,head);//p0用于......
  • 算法题:用队列实现一个链表
    下面是添加了注释的ListNode类和LinkedListQueue类,以帮助理解每个部分的功能和目的://定义链表节点类,用于存储队列中的元素classListNode{intval;//存储节点的值ListNodenext;//指向下一个节点的指针//构造函数,用于创建新的节点ListNod......
  • 19. 删除链表的倒数第 N 个结点
    相当于删除正数第n个节点classSolution{public:ListNode*removeNthFromEnd(ListNode*head,intn){if(!head)returnhead;intlistLength=0;ListNode*temp=head;while(temp){temp=temp->next;......
  • 五上数学第1单元情况反馈203班
    五上数学第1单元情况反馈203班本周进行了数学第一单元的综合练习,已经进行了讲评。试卷已经下发,请学生带回家改完错误,家长签字。签字在试卷的左上角,签字示范:家长阅,9月28日,或者再写一些建议与意见都可以。下面分析一下第一单元的情况:第一单元是本册最难的单元(小数除法)下面是......
  • 使用双向链表和哈希表实现LRU缓存
    在日常开发中,缓存是一个非常常见且重要的技术手段,能够显著提升系统性能。为了保证缓存的有效性,需要实现一种机制,在缓存空间不足时,能够自动淘汰最久未被使用的数据。这种机制就是**LRU(LeastRecentlyUsed,最近最少使用)**算法。一、LRU缓存的原理LRU是一种常用的缓存淘汰策......
  • 环形链表的约瑟夫问题
    一:题目二:思路前提:该题已经声明了结构体,只是看不见,声明如下:因为是从0开始实现:1:创建一个n个节点的循环链表,其值为1~n(假设n=5)如图:代码如下: structListNode*newnode=(structListNode*)malloc(sizeof(structListNode)); if(newnode==NULL) { perror("mal......
  • 数据结构编程实践20讲(Python版)—02链表
    本文目录02链表linked-listS1说明S2示例单向链表双向链表循环链表S3问题:反转单向链表求解思路Python3程序S4问题:双向链表实现历史浏览网页求解思路Python3程序S5问题:基于循环链表的玩家出牌顺序求解思路Python3程序往期链接01数组02链表linked-lis......
  • 数据结构——链表
    c++数据结构p3链表链表的每一个节点都是独立分配出来的从当前节点能够找到下一个节点Node(链表)=date(数据域)+next(地址域)地址域:存储的是下一个节点的地址最后一个地址域是nullptrstructNode{intdata;Node*next;}特点:每一个节点都是在堆内存上独立new出来......