先看83题,再看82题
83题
思路一
可以利用pre,cur分别保存前一个节点和当前节点,遇到重复的就一直向下走,直到不重复,此时令pre.next指向cur
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
dummy = ListNode(-1)
pre = dummy
cur = head
pre.next = cur
while cur and cur.next:
if cur.val == cur.next.val:
while cur.next and cur.val == cur.next.val:
cur = cur.next
pre.next = cur
pre = pre.next
cur = cur.next
else:
pre = cur
cur = cur.next
return dummy.next
思路二
将头节点保存起来,遇到重复的,直接把pre节点的next指向cur下一个节点的再下一个节点,就相当于删掉了一个重复的节点
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if not head:
return head
tmp = head
while head and head.next:
if head.val == head.next.val:
head.next = head.next.next
else:
head =head.next
return tmp
思路三
递归
- 找终止条件:当head指向链表只剩一个元素的时候,自然是不可能重复的,因此return
- 该返回什么值:应该返回的自然是已经去重的链表的头节点
- 每一步要做什么:宏观上考虑,此时head.next已经指向一个去重的链表了,而根据第二步,我应该返回一个去重的链表的头节点。因此这一步应该做的是判断当前的head和head.next是否相等,如果相等则说明重了,返回head.next,否则返回head
代码
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null){
return head;
}
head.next = deleteDuplicates(head.next);
if(head.val == head.next.val) head = head.next;
return head;
}
}
82题
思路一
这一题是除了重复的元素要删掉外,重复的元素本身也要删掉,那么与83题思路一不同的是,在遇到重复节点的时候的处理有所不同.
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if head == None or head.next == None:
return head
dummy = ListNode(-1)
pre = dummy #上一个点
cur = head #当前点
pre.next = cur
while cur and cur.next:
if cur.next != None and cur.val != cur.next.val:
pre = cur
cur = cur.next
else:
while cur.next != None and cur.val == cur.next.val:
cur = cur.next
pre.next = cur.next
cur = cur.next
return dummy.next
思路二
递归
终止条件:没节点了
这一步要做什么:遇到重复元素cur就一直往下走
这一步返回什么:已经删除重复元素的链表头节点