昨天一直在做PPT 真是PPT之王了 写个简单题(我打算今天学动态规划 但是今天聚餐,明天要写一下动态规划 tag)
给定一个已排序的链表的头 head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
思路很简单 就是双指针 如果后面的这个指针指向的节点的值 等于前一个指针指向的节点的值 那么就后面的指针往后移动 然后断开 蛮简单
class ListNode(object): def __init__(self, val=0, next=None): self.val = val self.next = next class Solution(object): def deleteDuplicates(self, head): dummy=head dummy1=head.next while dummy.next!=None: if dummy1.val==dummy.val: dummy1=dummy1.next dummy.next=dummy1 else: dummy1=dummy1.next dummy=dummy.next return head def array_to_linked_list(arr): if not arr: return None head = ListNode(arr[0]) current = head for val in arr[1:]: current.next = ListNode(val) current = current.next return head def print_linked_list(head): current = head while current: print(current.val) current = current.next solution=Solution() result=[1,1,2] result=array_to_linked_list(result) result=solution.deleteDuplicates(result) print_linked_list(result)
先不管题目要输出格式是如何的 这样写肯定是有问题的 很容易导致dummy1的空指针风险 其实一个指针就够了 如果这个指针指向的节点的值 和这个指针下一个节点的值是相同的 就断开就行
而且还要考虑空指针和只有一个节点的指针的情况 【我开始以为是要链表转数组 结果题目要求竟然是直接返回链表 】
# Definition for singly-linked list.
class Solution(object):
def deleteDuplicates(self, head):
if head==None :
return None
if head.next==None:
return head
dummy=head
while dummy.next!=None and dummy.next.next!=None:
if dummy.val==dummy.next.val:
dummy.next=dummy.next.next
else:
dummy=dummy.next
if dummy.next.next==None:
if dummy.val==dummy.next.val:
dummy.next=None
return head
#数组转链表
def array_to_linked_list(arr):
if not arr:
return None
head = ListNode(arr[0])
current = head
for val in arr[1:]:
current.next = ListNode(val)
current = current.next
return head
#打印链表
def print_linked_list(head):
current = head
while current:
print(current.val)
current = current.next
#链表转数组
def linked_list_to_array(head):
array = []
current = head
while current:
array.append(current.val)
current = current.next
return array
solution=Solution()
result=[1,1,2]
result=array_to_linked_list(result)
result=solution.deleteDuplicates(result)#这个结果是return head
#然后需要进行链表转数组
代码很简单 就是考虑好一些情况就行 然后我们一起分析一下运算速度第一的代码
# Definition for singly-linked list.
class Solution(object):
def deleteDuplicates(self, head):
if head==None :
return None
if head.next==None:
return head
dummy=head
while dummy.next!=None and dummy.next.next!=None:
if dummy.val==dummy.next.val:
dummy.next=dummy.next.next
else:
dummy=dummy.next
if dummy.next.next==None:
if dummy.val==dummy.next.val:
dummy.next=None
return head
#数组转链表
def array_to_linked_list(arr):
if not arr:
return None
head = ListNode(arr[0])
current = head
for val in arr[1:]:
current.next = ListNode(val)
current = current.next
return head
#打印链表
def print_linked_list(head):
current = head
while current:
print(current.val)
current = current.next
#链表转数组
def linked_list_to_array(head):
array = []
current = head
while current:
array.append(current.val)
current = current.next
return array
solution=Solution()
result=[1,1,2]
result=array_to_linked_list(result)
result=solution.deleteDuplicates(result)#这个结果是return head
#然后需要进行链表转数组
自我感觉 跟我的区别不大 好的 先写个简单题