删除排序链表中的重复元素

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中没有重复出现 的数字。

返回同样按升序排列的结果链表。

示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:

输入:head = [1,1,1,2,3]
输出:[2,3]

提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列

解法1class ListNode {
       int val;
       ListNode next;
       ListNode() {
       }
       ListNode(int val) {
             this.val = val;
       }
       ListNode(int val, ListNode next) {
             this.val = val;
             this.next = next;
       }
}
public class Solution {
       public ListNode deleteDuplicates(ListNode head) {
             if (head == null) {
                    return null;
             }
             ListNode result = null;
             ListNode i = null;
             ListNode currentValue = null;
             boolean isREpert = false;
             ListNode node = head;
             while (node != null) {
                    if (currentValue == null) {
                           currentValue = node;
                           node = node.next;
                           continue;
                    } else {
                           if (currentValue.val == node.val) {
                                 isREpert = true;
                                 node = node.next;
                                 continue;
                           } else {
                                 if (isREpert) {
                                        currentValue = null;
                                        isREpert = false;
                                        continue;
                                 } else {
                                        if (result == null) {
                                               result = i = currentValue;
                                               currentValue = null;
                                               isREpert = false;
                                               continue;
                                        } else {
                                               i.next = currentValue;
                                               i = currentValue;
                                               currentValue = null;
                                               isREpert = false;
                                               continue;
                                        }
                                 }
                           }
                    }
             }
             if (currentValue != null && !isREpert) {
                    if (result == null) {
                           result = i = currentValue;
                    } else {
                           i.next = currentValue;
                           i = currentValue;
                    }
             }
             if (i != null) {
                    i.next = null;
             }
             return result;
       }
}

这个时间方案,写了太多的if/else,自己写完之后,立刻看,都不知道对应的if/else是为什么这么做的
解法2:
方案2class ListNode {
       int val;
       ListNode next;
       ListNode() {
       }
       ListNode(int val) {
             this.val = val;
       }
       ListNode(int val, ListNode next) {
             this.val = val;
             this.next = next;
       }
}
public class Solution {
       /**
        * 将问题简化:

        * 判断头是否重复

        * 1.重复:去掉头部分,对于头之外的部分,递归使用本函数;      
        * 举例:1 --> 1 --> 1 --> 2 --> 3 头重复的情况,去掉所有的的节点1 ,用剩余的部分2,3调用本函数
        * 2.不重复:对于头之外的部分,递归使用本函数,结果作为头的子节点
        * 举例:1 --> 2 --> 3 ;头不重复,使用2,3调用本函数,作为1的子节点
        */
       public ListNode deleteDuplicates(ListNode head) {
             if (head == null || head.next == null) {
                    return head;
             }
             ListNode next = head.next;
             if (head.val == next.val) {
                    while (next != null && next.val == head.val) {
                           next = next.next;
                    }
                    head = deleteDuplicates(next);
             } else {
                    head.next = deleteDuplicates(next);
             }
             return head;
       }
}

结论:

1.尽量避免多层的if/else语句,非常难读懂代码
2.将文件尽量划归为多个重复的简单问题    重复、简单
3.对重复的、简单的问题进行处理,计算机就是和对重复、简单的问题做处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值