203 移除链表元素
掌握虚拟头结点的设置,熟系链表的指针操作,设置current来遍历链表,因为最后需要返回头结点,所以不能直接用头结点操作;
707 创建列表
首先都要判断N的合法性,应该0<N<self.size
在节点N插入节点:一定要保证current.next 指向N节点,这样才能在current这个节点操作
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)(这个操作什么意思,为什么没有定义新节点)
这就是定义新节点,ListNode这个函数意思是这个节点的值是val,下一个节点是curren.next
self.size += 1(增减都需要操作size)
83 删除列表
注意判断空链表
class Solution:
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head:
return head(开始没有加这两句,导致测试在【】时程序出错,通过检测测试案例检查出来)
cur=head
while cur.next:
if cur.val==cur.next.val:
cur.next=cur.next.next
else:
cur=cur.next(记住遍历条件)
return head
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
i=0
for i in range(len(numbers)):
j=i+1
while j<len(numbers):
if numbers[i]+numbers[j]<target:
j+=1
elif numbers[i]+numbers[j]==target:
return(i,j)
else:
break
return -1
(测试用例通过,但显示超出时间限制,暴力算法不可取,利用双指针方法会很简单,这是一个升序的数列)
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
l=0
r=len(numbers)-1
while l<r:
if numbers[r]+numbers[l]>target:
r-=1
elif numbers[r]+numbers[l]<target:
l+=1
else:
return(l,r)
return -1
需要用哈希表,等后面再刷
206 反转列表
1、用双指针法:忘记设置pre 这个指针了,
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
cur=head
pre=None
while cur.next:(终止条件设置错了,最后cur为None时,才能终止)
temp=cur.next
cur.next=pre
pre=cur
cur=temp
return
2、递归写法不太熟练,还需要再练习