本题要理解对象变换的操作,可变类型对象直接赋值后的变化对原对象的影响
引用自Python 直接赋值、浅拷贝和深度拷贝解析 | 菜鸟教程
1、b = a: 赋值引用,a 和 b 都指向同一个对象
2、b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
# 法1 原链表删除元素
# 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]:
while head != None and head.val == val:
head = head.next
current = head
while current != None and current.next != None:
if current.next.val == val:
current.next = current.next.next
else:
current = current.next
return head
# 法2 虚拟头节点
# 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]:
new = ListNode(None,head)
current = new
while current != None and current.next != None:
if current.next.val == val:
current.next = current.next.next
else:
current = current.next
new = new.next
return new
# 法1 单链表
class ListNode:
def __init__(self,val = 0,next = None):
self.val = val
self.next = next
class MyLinkedList:
def __init__(self):
self.fake_head = ListNode()
self.size = 0
def get(self, index: int) -> int:
if index < 0 or index > self.size - 1:
return -1
result = self.fake_head.next
for i in range(index):
result = result.next
return result.val
def addAtHead(self, val: int) -> None:
add_ = ListNode(val,self.fake_head.next)
self.fake_head.next = add_
self.size += 1
def addAtTail(self, val: int) -> None:
result = self.fake_head
while result.next != None:
result = result.next
result.next = ListNode(val)
self.size += 1
def addAtIndex(self, index: int, val: int) -> None:
if index > self.size:
pass
elif index == self.size:
self.addAtTail(val)
else:
result = self.fake_head
for i in range(index):
result = result.next
result.next = ListNode(val,result.next)
self.size += 1
def deleteAtIndex(self, index: int) -> None:
if index < 0 or index > self.size - 1:
pass
else:
result = self.fake_head
for i in range(index):
result = result.next
result.next = result.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)
复习
# 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]:
v = ListNode(0,head)
current = v
while current.next:
if current.next.val == val:
current.next = current.next.next
else:
current = current.next
return v.next
class ListNode:
def __init__(self,val = 0,next = None):
self.val = val
self.next = next
class MyLinkedList:
def __init__(self):
self.head = ListNode()
self.size = 0
def get(self, index: int) -> int:
if index >= self.size:
return -1
current = self.head.next
for i in range(index):
current = current.next
return current.val
def addAtHead(self, val: int) -> None:
new = ListNode(val,self.head.next)
self.head.next = new
self.size += 1
def addAtTail(self, val: int) -> None:
current = self.head
for i in range(self.size):
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:
pass
else:
current = self.head
for i in range(index):
current = current.next
new = ListNode(val,current.next)
current.next = new
self.size += 1
def deleteAtIndex(self, index: int) -> None:
if index < 0 or index >= self.size:
pass
else:
current = self.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)