首页 > 编程语言 >代码随想训练营第三天(Python) | 203.移除链表元素、707.设计链表、206.反转链表

代码随想训练营第三天(Python) | 203.移除链表元素、707.设计链表、206.反转链表

时间:2023-10-16 22:13:28浏览次数:48  
标签:node index 203 cur val self next 链表 移除

一、203.移除链表元素

关键点:如何删除节点,需要知道删除节点前的节点。

1、无虚拟头节点的方法
class Solution:
    def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
        while head != None and head.val == val:   # 如果头节点的值为 val
            head = head.next
        cur = head
        while cur:
            if cur.next != None and cur.next.val == val:  # 需要删除一个节点,需要知道前一个节点。所以这里判断是否删除 cur.next 指向节点
                cur.next = cur.next.next
            else:
                cur = cur.next
        return head
2、带虚拟头节点
class Solution:
    def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
        dummy_node = ListNode(next=head)
        cur = dummy_node
        while cur:
            if cur.next and cur.next.val == val: # 一样的删除节点需要知道前一个节点
                cur.next = cur.next.next
            else:
                cur = cur.next
        return dummy_node.next

总结: 涉及到链表删除的题,都使用一个虚拟头节点。因为需要判断头节点是否被删除了。

二、707.设计链表

关键点:涉及到删除和添加,设置一个虚拟头节点,方便操作。设置一个 self.size 方便进行 index 和 size 的判断。

class LinkNode:

    def __init__(self, val=None, next=None):
        self.val = val
        self.next = next


class MyLinkedList:

    def __init__(self):
        self.dummy_node = LinkNode()
        self.size = 0

    def get(self, index: int) -> int:
        if index < 0 or index > self.size - 1:
            return -1
        cur = self.dummy_node.next
        for _ in range(index):
            cur = cur.next
        return cur.val


    def addAtHead(self, val: int) -> None:
        add_node = LinkNode(val)
        add_node.next = self.dummy_node.next # 画图看下面一行代码和这一行代码谁在前面
        self.dummy_node.next = add_node
        self.size += 1

    def addAtTail(self, val: int) -> None:
        tail_node = LinkNode(val)
        cur = self.dummy_node 
        while cur.next:         # 连接最后一个节点,需要知道前一个节点
            cur = cur.next
        cur.next = tail_node
        self.size += 1

    def addAtIndex(self, index: int, val: int) -> None:
        if index < 0 or index > self.size:
            return
        index_node = LinkNode(val)
        cur = self.dummy_node
        while index:
            cur = cur.next
            index -= 1
        index_node.next = cur.next
        cur.next = index_node
        self.size += 1

    def deleteAtIndex(self, index: int) -> None:
        if index < 0 or index > self.size - 1:
            return
        cur = self.dummy_node
        while index:
            cur = cur.next
            index -= 1
        cur.next = cur.next.next
        self.size -= 1

三、206.反转链表

关键点:画图移动指针

双指针
class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if head is None:
            return head
        pre, cur = None, head
        while cur:     # 画图可知 cur 为 None 时退出循环
            tmp = cur.next # 临时变量 tmp 记录下 cur.next 的节点
            cur.next = pre # cur 节点指向 pre
            pre = cur      # pre 移动到 cur
            cur = tmp      # cur 移动到 cur.next
        return pre
递归
class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        cur, pre = head, None
        return self.reverse(cur, pre)

    # 递归反转 2 个节点之间的指向
    def reverse(self, cur, pre):
        if not cur:
            return pre
        # 记录下一个要交换指向的节点
        tmp = cur.next
        # 进行节点指向交换
        cur.next = pre
        # 移动指针指向
        pre = cur   
        cur = tmp
        return self.reverse(cur, pre)

标签:node,index,203,cur,val,self,next,链表,移除
From: https://www.cnblogs.com/yixff/p/17768244.html

相关文章

  • Leetcode203.移除链表元素
    题目描述给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例提交的代码/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}......
  • 链表的头插和尾插(数组--链表)
    头插法代码示例publicclassLinkDemo{publicstaticvoidmain(String[]args){//将这个数组按头插的方式插入列表int[]arr={1,2,3,4,5,6,7,8,9};headIndert(arr);}publicstaticvoidheadIndert(int[]arr){Nodeli......
  • 使用链表而不是 stdarg 实现可变参数函数
    Qidi2023.10.150.需要使用可变参数函数的场景常见的场景是类似于printf(char*fmt,...)函数,输入的参数个数和类型都是未知的,此时除了需要...表示可变参数列表,还需要用fmt参数说明参数的个数和类型。还有另一种场景,假设我们要实现一个音频控制功能的程序。在初始设计......
  • 如何移除子模块?
    内容来自DOChttps://q.houxu6.top/?s=如何移除子模块?如何移除Git子模块?为什么我不能执行gitsubmodulermmodule_name命令?自从git1.8.3(2013年4月22日)起:一旦你表达了对子模块的兴趣,gitsubmoduleinit,就没有了“我不再对这个子模块感兴趣”的Porcelain方式。gits......
  • C#内存缓存链表BytesListBuffer
    C#自带MemoryStream,可以作为内存缓存使用,用来存储byte[]数据,但是MemoryStream的扩展机制是通过获取整块连续内存来缓存数据,当需要缓存较大数据时,虽然空闲内存可能足够,但是可能找不到足够大的整块连续内存而导致扩展失败产生outofmemory的异常。另外,对于很多缓存场景,重新分配整块......
  • JS操作增加Class属性和移除删除Class属性
    直接上代码functiongo(a){if(a=='shifu'){//移除属性varshop=document.getElementsByClassName("shop")[0];shop.classList.remove("ns-border-color");//增加属性......
  • 如何预防网络数据丢失203.135.128.x
    数据丢失对于任何规模的企业来说都可能是灾难性的事件,并且代价高昂,这就是预防数据丢失至关重要的原因。企业可以使用各种程序来增强其网络安全性并防止数据丢失。此外,他们可以使用多种策略来管理数据泄露。数据备份和加密。在各种策略中,定期数据备份是企业应该实施的关键策略之一。......
  • 面试必刷TOP101:3、链表中的节点每k个一组翻转
    一、题目将给出的链表中的节点每k 个一组翻转,返回翻转后的链表如果链表中的节点数不是k的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。二、题解publicclassSolution{/****@paramheadListNode类*@paramkint整型......
  • 面试必刷TOP101:2、链表内指定区间反转
    一、题目将一个节点数为size链表m 位置到n位置之间的区间反转,要求时间复杂度O(n),空间复杂度O(1)。例如:importjava.util.*;/**publicclassListNode{*intval;*ListNodenext=null;*}*/publicclassSolution{/****@paramhea......
  • 力扣19.删除链表的倒数第 N 个结点
    给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5] 示例2:输入:head=[1],n=1输出:[] 示例3:输入:head=[1,2],n=1输出:[1]  提示:链表中结点的数目为 sz1<=sz<=300<=N......