203 :移除链表元素
题目链接:203. 移除链表元素 - 力扣(LeetCode)
题目要求:
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
思考:可以使用虚拟节点来避免头结点和其他节点不同的分类情况
dummy_head = ListNode(next=head) #添加一个虚拟节点
易错点:cur!=None写成了cur.next!=None,会导致空链表出现cur.next不存在的报错
# 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]:
cur=head
while cur!=None:
if cur.val==val:
if cur==head:
head=cur.next
cur=head
else:
previous.next=cur.next
cur=cur.next
else:
previous=cur
cur=cur.next
return head
206 反转链表
题目链接:
206. 反转链表 - 力扣(LeetCode)
题目要求
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]。
方法:头插法
注意点: prev = None不加的话会形成无限循环
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
cur = head
prev = None
while cur is not None:
next_node = cur.next
cur.next = prev
prev = cur
cur = next_node
return prev
707.设计链表
题目:
你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性:val
和 next
。val
是当前节点的值,next
是指向下一个节点的指针/引用。
如果是双向链表,则还需要属性 prev
以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。
实现 MyLinkedList
类:
MyLinkedList()
初始化MyLinkedList
对象。int get(int index)
获取链表中下标为index
的节点的值。如果下标无效,则返回-1
。void addAtHead(int val)
将一个值为val
的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。void addAtTail(int val)
将一个值为val
的节点追加到链表中作为链表的最后一个元素。void addAtIndex(int index, int val)
将一个值为val
的节点插入到链表中下标为index
的节点之前。如果index
等于链表的长度,那么该节点会被追加到链表的末尾。如果index
比长度更大,该节点将 不会插入 到链表中。void deleteAtIndex(int index)
如果下标有效,则删除链表中下标为index
的节点。
示例:
输入 ["MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get"] [[], [1], [3], [1, 2], [1], [1], [1]] 输出 [null, null, null, null, 2, null, 3] 解释 MyLinkedList myLinkedList = new MyLinkedList(); myLinkedList.addAtHead(1); myLinkedList.addAtTail(3); myLinkedList.addAtIndex(1, 2); // 链表变为 1->2->3 myLinkedList.get(1); // 返回 2 myLinkedList.deleteAtIndex(1); // 现在,链表变为 1->3 myLinkedList.get(1); // 返回 3
题目反思:使用虚拟头结点可以减少讨论的数量 注意循环时 从虚拟头节点开始循环current=self.dummyHead,而不是current=self.dummyHead.next,可以避免空链表的问题
题目链接/文章讲解/视频讲解:代码随想录
class ListNode:
def __init__(self,value=0,next=None):
self.value=value
self.next=next
class MyLinkedList:
def __init__(self):
self.dummyHead=ListNode()
self.size=0
def get(self, index: int) -> int:
if index<0 or index>=self.size:
return -1
current=self.dummyHead.next
for i in range(index):
current=current.next
# print(self.dummyHead.next.next)
return current.value
def addAtHead(self, val: int) -> None:
new=ListNode()
new.value=val
new.next=self.dummyHead.next
self.dummyHead.next=new
self.size+=1
# print(self.dummyHead.next.next)
def addAtTail(self, val: int) -> None:
current=self.dummyHead
while current.next:
current=current.next
current.next=ListNode(val)
self.size+=1
# print(self.dummyHead.next.next)
def addAtIndex(self, index: int, val: int) -> None:
if index<0 or index>self.size:
return
if index==self.size:
self.addAtTail(val)
return
current=self.dummyHead
for i in range(index):
current=current.next
new=ListNode(val,current.next)
current.next=new
self.size+=1
# print(self.dummyHead.next.next)
def deleteAtIndex(self, index: int) -> None:
if index<0 or index>self.size-1:
return
current=self.dummyHead
for i in range(index):
current=current.next
rem=current
current=current.next
rem.next=current.next
self.size-=1
# print(self.dummyHead.next.next)
# 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)