移除链表元素 1)使用虚拟头节点的思想,使链表中每一个位置的移除都统一。但是要新建一个current指针用来遍历链表,最好不要动虚拟头节点(它要用来return)。新建节点的时候要注意语法,不像java一样需要new。 2) cur = cur.next应写在else中,因为改变cur.next是每轮循环需要做的。
代码:
# Definition for singly-linked list.# class ListNode(object):# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclassSolution(object):defremoveElements(self, head, val):"""
:type head: ListNode
:type val: int
:rtype: ListNode
"""
virtualHead = ListNode()# cur = ListNode()没有必要
virtualHead.next= head
cur = virtualHead
while cur.next!=None:if cur.next.val == val:
cur.next= cur.next.nextelse:
cur = cur.next#注意这一行应该单独写在else, 因为其实在每一次循环中,我们只想更新cur.next的值,而在if中已经做了改变。return virtualHead.next
设计链表 1)错误点主要有三,一是对插入尾节点时候,要借助next指针,不能指向最后一个null再赋值,单纯让两个指针相等,相当于让他们所指向的东西相同,但无法起到链表的连接作用!!!真的debug了很久wtf。 2)对于插入节点的index判断,当index == 0 or == self.size的时候,分别调用插入头节点和尾节点的函数。 3)这里的head所代表的和上一道题不同。这里的是在头节点之前的null节点,因为初始化的时候需要用到它,所以用法要和上一题有区分。
代码
classNode(object):def__init__(self, x=0):
self.val = x
self.next=NoneclassMyLinkedList(object):def__init__(self):
self.head = Node()
self.size =0defget(self, index):"""
:type index: int
:rtype: int
"""if index >= self.size or index <0:return-1
cur = self.head.nextwhile index >0:
cur = cur.next
index -=1return cur.val
defaddAtHead(self, val):"""
:type val: int
:rtype: None
"""
temp = Node(val)
temp.next= self.head.next
self.head.next= temp
self.size +=1defaddAtTail(self, val):#错在这了 重点看"""
:type val: int
:rtype: None
"""# temp = Node(val)# cur = self.head.next# while cur:# cur = cur.next# cur = temp# self.size += 1
new_node = Node(val)
cur = self.head
while(cur.next):
cur = cur.next
cur.next= new_node
self.size +=1defaddAtIndex(self, index, val):"""
:type index: int
:type val: int
:rtype: None
"""if index <0or index > self.size:returnelif index ==0:
self.addAtHead(val)elif index == self.size:
self.addAtTail(val)else:
cur = self.head.nextwhile index >1:
cur = cur.next
index -=1
temp = Node(val)
temp.next= cur.next
cur.next= temp
self.size +=1defdeleteAtIndex(self, index):"""
:type index: int
:rtype: None
"""if index <0or index >= self.size:returnelse:
cur = self.head
while index >0:
cur = cur.next
index -=1
cur.next= cur.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)
classSolution(object):defreverseList(self, head):"""
:type head: ListNode
:rtype: ListNode
"""
pre =None
cur = head
while cur:
temp = cur.next
cur.next= pre
pre = cur
cur = temp
return pre
递归写法:先定义函数再调用
defreverseList(self, head):"""
:type head: ListNode
:rtype: ListNode
"""defreverseTry(cur, pre):if cur ==None:return pre
temp = cur.next
cur.next= pre
return reverseTry(temp, cur)return reverseTry(head,None)