算法_链表_删除排序链表中的重复元素_留一个

jasmine 于 2019-06-02 发布
/**
 * 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
 * 输入:head = [1,1,2]
 * 输出:[1,2]
 * 示例 2:
 * 输入:head = [1,1,2,3,3]
 * 输出:[1,2,3]
 * 提示:
 * 链表中节点数目在范围 [0, 300] 内
 * -100 <= Node.val <= 100
 * 题目数据保证链表已经按升序 排列
 */
public class 删除排序链表中的重复元素_留一个 {
    /**
     * 方法:转移到新NodeList,判断去重
     */
    public static Node.IntNode deleteDuplicates(Node.IntNode head) {
        //创建新的NodeList
        Node.IntNode resNode = new Node.IntNode(-1);
        Node.IntNode tempNode = head;
        while (tempNode != null) {//遍历将所有元素添加到resNode中
            int val = tempNode.val;

            //判断去重过程
            boolean isAdd = true;
            Node.IntNode tempResNode = resNode;
            while (tempResNode.next != null) {
                tempResNode = tempResNode.next;
                if (tempResNode.val == val) {
                    isAdd = false;
                }
            }
            if (isAdd) {//如果没有重复,拼接新节点
                tempResNode.next = new Node.IntNode(val);
            }

            tempNode = tempNode.next;
        }
        return resNode.next;
    }

    /**
     * 方法:双指针
     */
    public static Node.IntNode deleteDuplicates2(Node.IntNode head) {
        //第一个指针:当有重复元素的时候不移动到下一个
        Node.IntNode preNode = new Node.IntNode(-111, head);
        Node.IntNode currNode = head;
        while (currNode != null) {
            int val = currNode.val;
            if (preNode.val == val) {//比较两个指针的数值是否一样
                preNode.next = currNode.next;
            }else {//没重复的时候移动前指针
                preNode = preNode.next;
            }
            //每次都移动当前指针
            currNode = currNode.next ;
        }
        return head;
    }

    public static void main(String[] args) {
        Node.IntNode resNode = deleteDuplicates2(Node.getIntNode11135());
        Node.IntNode.printNodes(resNode);
    }
}