文章目录
- 一、203. 移除链表元素
- 感受
- 代码
- 二、707.设计链表
- 感受
- 代码
- 206.反转链表
- 感受
- 总结
一、203. 移除链表元素
感受
我对这道题。从理论上来说太熟悉了。咸鱼讲数据结构常用的方法他都会讲。但是我没上机没写过。到后面上机还是写不出来。giao。
代码
第一次写,想说一下,要注意边界值。我第一次的时候,循环的条件就写错了。我写成 while q.next and q.next.next了 认为删除操作,至少要有三个node节点,结果还要单独处理尾节点。
# 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]:
# 如果为空,就直接返回
if not head:
return head
#现在,我们在实现有头结点的版本
# 现在p就是虚拟头结点了
p = ListNode(next=head)
# 新建了一个指针,让他来遍历我们的单链表
q = p
while q.next:
if q.next.val == val:
q.next = q.next.next
else:
# 如果不相等,就继续下一个
q = q.next
return p.next
二、707.设计链表
感受
这道题出的真的蛮好的,我之前都是理论,没有实操过,今天一写就发现自己独立写不出来.这种还是要多写几次,形成肌肉记忆.
代码
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 _ in range(index):
current = current.next
return current.val
# 头插法
def addAtHead(self, val: int) -> None:
# 头插法的重点在于,插入的顺序
# 6,1行完成了头插法
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
# 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.反转链表
感受
当时我考研的理论是用头插法来实现,今天卡哥这个双指针又给我震住了,太骚了
总结
感觉今天收货满满,今天也花了很多的时候来想这个东西.