题目链接:https://leetcode.com/problems/remove-linked-list-elements/
leetcode 203
讲解链接:
看到题目的第一思路:
不太难 大概了解用什么方法 删除 但是没有仔细想到划分删除头结点的情况
代码随想录之后的想法和总结:
知道了要想到删除头结点的情况,以及了解了虚拟头结点这个思路 可以运用到以后的题目中
遇到的困难:
无
可以记录备用的固定代码方法模版:
# 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]:
dummy_node = ListNode(next = head) #首先定义虚拟头节点
current = dummy_node #从虚拟头节点开始遍历
while current.next:#判断虚拟头节点的下一位
if current.next.val == val:#当判断下一位符合删除
current.next = current.next.next #指向下一位的再下一位节点
else:
current = current.next #不用删除,直接从下一位开始遍历
return dummy_node.next #return 虚拟节点的下一位才是新的头节点
题目链接:707
leetoce
https://leetcode.com/problems/design-linked-list/
讲解链接:
看到题目的第一思路:
这题目看起来好复杂 仔细读过以后发现是一道练习链表操作的很好的题目
代码随想录之后的想法和总结:
理解了一个function的逻辑就可以运用到其他了,并且链表增查删改的操作以后也可以用到
遇到的困难:
addAtHead时候遇到了一点问题,但是想明白了逻辑在ListNode中怎样给新插入的头节点赋值
可以记录备用的固定代码方法模版:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class MyLinkedList:
def __init__(self):
self.dummy_head = ListNode()
self.size = 0
def get(self, index: int) -> int:
if index < 0 or index >= self.size:
return -1
current = self.dummy_head.next
for i in range(index):
current = current.next
return current.val
def addAtHead(self, val: int) -> None:
self.dummy_head.next = ListNode(val, self.dummy_head.next)
self.size += 1
def addAtTail(self, val: int) -> None:
current = self.dummy_head
while current.next:
current = current.next
current.next = ListNode(val)
self.size += 1
def addAtIndex(self, index: int, val: int) -> None:
if index < 0 or index > self.size:
return
current = self.dummy_head
for i in range(index):
current = current.next
current.next = ListNode(val, current.next)
self.size += 1
def deleteAtIndex(self, index: int) -> None:
if index < 0 or index >= self.size:
return
current = self.dummy_head
for i in range(index):
current = current.next
current.next = current.next.next
self.size -= 1
题目链接:206
leetcode
讲解链接:
看到题目的第一思路:
无
代码随想录之后的想法和总结:
双指针方法很妙很清晰,但是递归方法比较难懂 暂时还没理解
遇到的困难:
1 在理解pre,cur, temp三个指针的定义与移动时候稍微画图理解了一下
主要注意点
- 先用temp指针保存cur的下一个节点数值,再反转cur指针指向pre,否则无法获取到temp节点数值
- 用cur.next = pre而不是pre = cur.next来反转next指针,因为如果那样就和temp节点方法一样,正常指向下一个节点而非前一个节点了
- 注意pre 和cur的移动顺序不能变,先移动pre = cur再cur = temp因为如果反过来pre的数值就不对了
2 while cur:的loop语法有点忘记了
(来自chatgpt解释:
这种方法的好处是,它直接使用对象的存在性作为循环的继续条件,既简洁又直观。当cur
指向链表的某个节点时,循环继续执行;当链表遍历完毕或cur
为None
时,循环停止。这使得代码易于理解和维护,也利用了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]:
cur = head
pre = None #头节点反转后变成尾节点指向null
while cur:
#As long as cur is not None (which means there are still nodes to process),
#the loop will continue
temp = cur.next# 保存一下 cur的下一个节点,因为接下来要改变cur->next
cur.next = pre #反转
#更新pre、cur指针
pre = cur
cur = temp
return pre #反转过后链表的头节点 正是之前链表的尾节点
今日收获,学习时长:
4h
感觉到理解能力和手感有点回来了
继续加油坚持 希望跟上节奏