#leetcode83.删除排序链表中的重复元素
删除链表中的重复的元素,属于数据结构中链表类的题目,先贴一下代码:
public ListNode deleteDuplicates(ListNode head) { if (head == null || head.next == null) return head; head.next = deleteDuplicates(head.next); return head.val == head.next.val ? head.next : head; }
首先分析判断条件
if(head == null || head.next ==null)
如果head 本身是null 或者head.next == null 即如果是空链表或者是只有一个节点的链表,那么不需要经过处理直接返回就可以了~
但这里的判断条件其实既是特殊情况的判断条件,同时也是递归的判断条件
看下面的第二句:
head.next = deleteDuplicates(head.next);
这一句的递归调用会不断的让链表往后走,一直走到最后一个节点,即当满足head.next==null的时候,就会直接返回最后一个链表节点,返回的值和head.next = 最后一个节点链接起来组成一句,而此时的head已经不是最后一个节点了,因为最后一个节点所处的函数已经返回了,当前的语境其实已经是递归返回后的倒数第二个节点所对应的函数体内了,因此其实这条代码的意思是将倒数第二个节点的值连接到倒数第一个上!最后判断后两个节点的值是否相等,如果是就返回倒数第一个,否则就返回倒数第二个!
Tips:这里有一个问题之前我一直没想明白,就是为什么要倒数第二个链接倒数第一个这样看似毫无意义的操作呢?本来不就是倒数第二个和倒数第一个相连接的吗?
其实问题的原因出在一旦两个节点值相等,那么将会发生跳跃连接,就是倒数第三个直接连到倒数第一个的情况,这时这句看似无用的话其实就发挥了其作用了啊!链表毕竟是链表不是说倒数第一个节点和倒数第二个节点值相等所以倒数第三个节点连接它们俩的哪一个都可以的,如果真是这样就起不到删除重复节点的作用了!
至此基本上所有的难点都分析的差不多了,完结撒花~如果理解的有不到位的地方欢迎看这篇博客的人批评指正哈!