从今天开始,先更新leetcode上与链表有关的题,从简入繁吧。
这一题是一道简单类别的题目,多采用几种方法,主要是加强对于链表的理解。
1.题目
原题:
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
例子:
输入: 1->1->2->3->3
输出: 1->2->3
2.解析
这个题解法比较多,审题的关键在于这是一个排序的链表,因此不用考虑用一个额外的数组储存链表中已经出现元素的值。分三个思路来说吧。
(1)链表直接操作,定义一个当前链表和一个next链表,每次计算二者值是否相同,如果相同可以直接赋予next值,如果不同则要跳过,最后为了避免链表结尾出现重复元素,需要再while循环后加一个cur.next=None,表示链表的结束。
(2)也是链表直接操作,只不过这个不用定义pre链表,直接用next操作,原理上更好理解,实现起来也方便。
(3)这种解法是新定义一个链表,再插入数据。这个就是新建一个head为0的空链表,然后不断插入数据,不同实现方式大同小异。唯独注意一点,head和head.next两个同时成立的时候,会忽略掉最后一个变量,需要特殊处理一下,就是将while中的head.next加入到if中。
3.python代码
#解法1
class Solution:
def deleteDuplicates(self, head):
if not head:
return None
p = head
pre = p
cur = p.next
while cur:
if cur.val == pre.val:
cur = cur.next
else:
pre.next = cur
cur = cur.next
pre = pre.next
return head
#解法2
class solution:
def deleteDuplicates(self, head):
if not head:
return None
p = head
cur = p
while cur and cur.next:
if cur.val == cur.next.val:
cur.next = cur.next.next
else:
cur = cur.next
return head
#解法3
class solution:
def deleteDuplicates(self, head):
if not head:
return None
new = ListNode(0)
tmp = new
while head:
if head.next and head.val == head.next.val:
head = head.next
else:
tmp.next = ListNode(head.val)
tmp = tmp.next
head = head.next
return new.next
网友评论