1.学习链表
链表只需定义head, head指向链表的头部node,剩余部分都由node完成
node 包含两个属性, value和next
class Node:
def __init__(self,initdata):
self.data = initdata
self.next = None
class UnorderedList:
def __init__(self):
self.head = None
2. 读题
删除链表的指定元素,必须先找到该元素,所以要scan整个链表。
该元素可能重复,所以while 终止条件不能找到即停止,需要遍历整个链表,遍历整个链表为 while 链表!=None
链表删除元素:把 previous.next = current.next 即把当前current node删除了
如果没有previous怎么办(previous = None), 表示current就是head头部,需要删除头部head节点,此时需要修改链表的head而不是previous.next
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def removeElements(self, head, val):
"""
:type head: ListNode
:type val: int
:rtype: ListNode
"""
current = head
previous = None
found = False
while current != None:
if current.val == val:
if previous == None:
head = current.next
else:
previous.next = current.next
else:
previous = current
current = current.next
return head
3. Tips
上述解法超时。。。啊,气死我了。
来看看咋解决:这里的头节点需要单独判断,如果需要删除的是头节点,需特殊处理,把链表的head(而不是previous node的next)指向下一个node。 如果这里我们加一个无关紧要的假头部dummy_head在head之前,使dummy.next = head, 那么head就不需要特殊处理了。
同时往前存一个还有个好处,可以.next.next 推两个,不需要创建previous保存前一个了,所以current 表示我们关注的上一个node, current.next才是我们关注的node,current.next.next 是后一个值
class Solution(object):
def removeElements(self, head, val):
"""
:type head: ListNode
:type val: int
:rtype: ListNode
"""
dummy_head = ListNode(-1)
dummy_head.next = head
current = dummy_head
while current.next != None:
if current.next.val == val:
current.next = current.next.next
else:
current = current.next
return dummy_head.next
理解链表这个数据结构,只需要head告诉链表的头在哪就好了。 同样 1 > 3 > 5 > 9 > 12
head指向1, return head 就是 13 5 9 12
head指向5, return head 就是 5 9 12