当前位置: 首页 > news >正文

203.移除链表元素 707.设计链表 206.反转链表

 203.移除链表元素

Python链表节点定义:
class ListNode:def __init__(self, val, next=None):self.val = valself.next = next
性能分析

链表的特性和数组的特性进行一个对比,如图所示:

203. 移除链表元素

这道题就是给大家一个链表,移除链表中等于某个target的所有节点。然后返回这个链表的头节点。

如果我们删除这个节点的话,让这个节点的前一个节点,指向这个节点的下一个节点。这样我们就把这个元素从列表中移除了。

移除节点时有一个问题。如果移除的节点是头节点,头节点没有前一个节点,我们要把Head向下移1位  head=head.next。这样我们就把头结点,从链表中删除了。他的新的头结点是原来的第二个节点。

从列表中移除元素针对头节点和非头节点的移除元素的方式是不一样的。
那么我们在实现这段代码逻辑的时候就要做一个判断,我们删除的这个节点是不是头节点?这样的话我们删除节点的方式就没有统一,能不能有一种方式能统一的方式删除所有节点?
还有一种方法叫做虚拟头结点的方法:就是在这个列表中再加入一个头节点。这个头节点叫做dummy head。是虚拟的。这样的话我们再去删除列表中的元素时,所有的元素都可以按照一个规则进行删除。

不用虚拟头节点来删除代码中元素的方法:

首先我们要判断我们删除的元素是不是头节点。
这个头节点一定要不为空,因为我们接下来要取这个头节点的值。如果这个头节点为空的话,我们相当于取了一个空指针,编译的时候会报错。同时这个头节点的数值等于我们要删除的值。满足这样的情况时,我们要把这个头节点删掉。
if (head != null and head->val == target)
我们进行移除头节点的操作后,移动到下一个节点时发现还是一样。所以我们移除头节点其实是一个持续移除的过程。所以这里应该是while。
while (head != null and head->val == target)head = head->nextcur  = head
这里的临时指针为什么是从head开始而不是从它的下一个节点开始?例如说我现在要删除第二个元素。删除第二个元素要找他的上一个节点指向他的下一个节点。所以这里要记录该节点的上一个节点。所以我们要删除head.next要从head开始。
whlie(cur != null && cur.next != null){
这两个值不能为空,否则在取值时会出现空指针错误。if (cur->next->val == target){cur->next = cur->next->next}else {cur = cur->next}return head

用虚拟头节点的方法:

首先将dummyhead的实例化,new出来一个节点
dummyhead = new ListNode()
dummyhead->next = head
定义一个临时指针来遍历链表,头节点的指针是不能改的。否则最后返回的头节点一直在变化。
cur = dummyhead 
这里为什么不定义cur = dummyhead.next?我们如果要删掉一个元素,必须要知道这个元素的上一个元素是什么。
while(cur->next != null){if (cur->next->val == target){cur->next = cur->next->next;else{cur = cur->next}
return dummyhead->next
为什么不返回head?因为head有可能已经被我们删掉了。

Python代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:dummyhead = ListNode()dummyhead.next = headcur = dummyheadwhile cur.next != None:if cur.next.val == val:cur.next = cur.next.nextelse:cur = cur.nextreturn dummyhead.next

707. 设计链表

 

Python代码:

class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextclass MyLinkedList:def __init__(self):self.dummy_head = ListNode()self.size = 0def get(self, index: int) -> int:if index < 0 or index >= self.size:return -1current = self.dummy_head.nextfor i in range(index):current = current.nextreturn current.valdef addAtHead(self, val: int) -> None:self.dummy_head.next = ListNode(val, self.dummy_head.next)self.size += 1def addAtTail(self, val: int) -> None:current = self.dummy_headwhile current.next:current = current.nextcurrent.next = ListNode(val)self.size += 1def addAtIndex(self, index: int, val: int) -> None:if index < 0 or index > self.size:returncurrent = self.dummy_headfor i in range(index):current = current.nextcurrent.next = ListNode(val, current.next)self.size += 1def deleteAtIndex(self, index: int) -> None:if index < 0 or index >= self.size:returncurrent = self.dummy_headfor i in range(index):current = current.nextcurrent.next = current.next.nextself.size -= 1# Your MyLinkedList object will be instantiated and called as such:
# obj = MyLinkedList()
# param_1 = obj.get(index)
# obj.addAtHead(val)
# obj.addAtTail(val)
# obj.addAtIndex(index,val)
# obj.deleteAtIndex(index)

206. 反转链表

Python代码:

# 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]:pre =Nonecur = headwhile cur:temp = cur.nextcur.next = prepre = curcur = tempreturn pre方法二:
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverse(self, cur: Optional[ListNode], pre: Optional[ListNode]) ->Optional[ListNode]:if cur == None:return pretemp = cur.nextcur.next = prereturn self.reverse(temp, cur)def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:return self.reverse(head, None)

http://www.dtcms.com/a/316281.html

相关文章:

  • Python ttkbootstrap桌面应用开发示例
  • 创建一个可以edit的graph-node-test的永久登录dashboard的token
  • vue3通过按钮实现横向滚动或鼠标滚动横坐标滚动
  • 预测性维护:数字孪生如何重塑航空航天维修与寿命管理
  • Java技术栈/面试题合集(13)-网络篇
  • 李亚鹤:河南息县:淮河金沙滩开园 再添亲水休闲文旅地
  • 在Maxscript中随机化对象变换、颜色和材质
  • 拖车式变电站:灵活电力供应的“移动堡垒”,驱动全球能源转型新引擎
  • nuxt学习笔记
  • 学术论文命名:策略、方案、方法三者的区别
  • 使用Docker Desktop部署MySQL8.4.3
  • LeetCode 149:直线上最多的点数
  • 深入理解 C 语言中的拷贝函数
  • 多模态新方向|从数据融合到场景落地,解锁视觉感知新范式
  • 智能驾驶再提速!批量苏州金龙L4级自动驾驶巴士交付杭州临平区
  • 结合opencv解释图像处理中的结构元素(Structuring Element)
  • 使用PyQT创建一个简单的图形界面
  • 【面试场景题】日志去重与统计系统设计
  • 人工智能领域、图欧科技、IMYAI智能助手2025年5月更新月报
  • UGUI源码剖析(1):基础架构——UIBehaviour与Graphic的核心职责与生命周期
  • Git 中**未暂存**和**未跟踪**的区别:
  • 【深度学习-Day 41】解密循环神经网络(RNN):深入理解隐藏状态、参数共享与前向传播
  • P2161 [SHOI2009] 会场预约
  • 中山铸造加工件自动蓝光三维测量方案-中科米堆CASAIM
  • 喷砂机常见故障及排除维修解决方法有哪些?
  • 猎板深度解析:EMI 干扰 —— 电子设备的隐形 “破坏者”
  • Dot1x认证原理详解
  • 利用 Radius Resource Types 扩展平台工程能力
  • 在 QtC++ 中调用 OpenCV 实现特征检测与匹配及图像配准应用
  • Linux DNS缓存与Nginx DNS缓存运维文档