LeetCode
No.83 删除排序链表中的重复元素
题目
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
Related Topics
链表
难度: 简单
分析:
首先链表已经排序,每次比较两个相邻的节点,如果相等,删除第一个节点
所以用递归解决,代码只有几行,但是逻辑性比较强,需要理解递归,有问题可以留言
-
第一步判空,为递归结束的条件
-
当当前的head为空也就是链表为空,直接返回
-
当下一个节点为空,也就是只有一个节点的时候,直接返回
//注意,两个判断语句不能反,否则的话如果是空链表 //head.next == null会空指针异常 if (head == null || head.next == null ) return head;
-
-
第二步,假设每一个递归调用的时候,递归函数都会将后面的所有节点处理完成,递归函数参数传下一个节点,意思就是让函数处理下一个节点之后的,当处理完之后,返回处理完成的链表。然后head.next也就是head之后的节点,和函数返回的节点链接在一起,此时,只有head杰恩head.next两个节点的值没比较
head.next = deleteDuplicates(head.next);
-
第三步,判断head和head.next节点的值是否相等,相等舍弃head返回head.next,否则返回head.next
return head.val == head.next.val ? head.next:head;
图示
代码
class Solution {
public ListNode deleteDuplicates(ListNode head) {
//链表为空直接返回,只有一个节点直接返回
if (head == null || head.next == null )
return head;
//假设递归调用一次会将后面的链表处理好
//也就是第二个节点之后重复的都删了
//所以第二个节点head.next应该链接返回的链表
head.next = deleteDuplicates(head.next);
//因此比较第一个和第二个节点,这里运用了三目运算符
//如果相等,那么就返回head.next,舍弃第一个节点
//如果不相等就返回头节点
return head.val == head.next.val ? head.next:head;
}
}