删除重复节点

题目:传入一个排序数字链表,删除其中重复的元素 

package com.example.demo;


import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Iterator;
import java.util.LinkedList;

/**
 *
 */

@SpringBootTest
public class DeleteDuplicatedNode {
    private static final Logger LOGGER = LoggerFactory.getLogger(DeleteDuplicatedNode.class);

    /**
     * 题目:传入一个排序数字链表,删除其中重复的元素
     * 思路:只保留不重复的链表元素。由于链表已经排序,若不重复则前后元素肯定不同。
     * 用标志位判断上个元素是否重复,若没有则加入到新的链表中
     * 返回新链表
     *
     * @param sortedLinkedList :排序的链表
     * @return
     */
    public static LinkedList<Integer> deleteDuplicateNode(LinkedList<Integer> sortedLinkedList) {
        //入参校验
        if (sortedLinkedList == null || sortedLinkedList.size() <= 0) return sortedLinkedList;
        LinkedList<Integer> resLinkedList = new LinkedList<>();//结果LinkedList
        Integer lastNode = sortedLinkedList.pollFirst();
        boolean nodeDuplicated = false;//标记节点是否重复,默认节点不重复
        while (lastNode != null) {
            Integer currentNode = sortedLinkedList.pollFirst();
            if (!lastNode.equals(currentNode)) {//上个节点和当前节点不同,且上个节点不是重复节点,则把上个节点加入结果链表
                if (!nodeDuplicated)
                    resLinkedList.addLast(new Integer(lastNode));
                lastNode = currentNode;
                nodeDuplicated = false;//当前节点默认为不重复
            } else {
                nodeDuplicated = true;
            }
        }
        return resLinkedList;
    }

    /**
     * 思路:对排序链表进行遍历,发现重复元素就移除,返回本链表
     *
     * @param sortedLinkedList
     * @return
     */
    public static LinkedList<Integer> deleteDuplicateNodeReturnSelf(LinkedList<Integer> sortedLinkedList) {
        if (sortedLinkedList == null || sortedLinkedList.size() <= 0) return sortedLinkedList;
        Integer lastNode = sortedLinkedList.peekFirst();
        boolean nodeDuplicated = false;
        for (int i = 1; i < sortedLinkedList.size(); i++) {
            Integer node = sortedLinkedList.get(i);
            if (!lastNode.equals(node)) {
                if (nodeDuplicated) {
                    sortedLinkedList.remove(lastNode);
                    i--;
                }
                lastNode = node;
                nodeDuplicated = false;//新节点默认为不重复
            } else {
                sortedLinkedList.remove(lastNode);
                if (i - 1 >= 0) i--;
                nodeDuplicated = true;
            }
        }
        return sortedLinkedList;
    }

    @Test
    public void testDeleteDuplicateNode() {
        LinkedList<Integer> linkedNodes = new LinkedList<>();
        for (int i = -1; i < 10; i++) {
            linkedNodes.add(i);
            if (i % 5 == 0) continue;
            linkedNodes.add(i);
            if (i % 2 == 0) continue;
            linkedNodes.add(i);

            linkedNodes.add(i);
        }
        LOGGER.info("原始数据: " + linkedNodes);
        long startTime = System.currentTimeMillis();
        LOGGER.info("执行结果: " + deleteDuplicateNode(linkedNodes));
//        deleteDuplicateNode(linkedNodes);
        LOGGER.info("总时间消耗:" + (System.currentTimeMillis() - startTime));

    }

    @Test
    public void testDeleteDuplicateNodeReturnSelf() {
        LinkedList<Integer> linkedNodes = new LinkedList<>();
        for (int i = -1; i < 10; i++) {
            linkedNodes.add(i);
            if (i % 5 == 0) continue;
            linkedNodes.add(i);
            linkedNodes.add(i);
        }
        LOGGER.info("原始数据: " + linkedNodes);
        long startTime = System.currentTimeMillis();
        LOGGER.info("执行结果: " + deleteDuplicateNodeReturnSelf(linkedNodes));
        LOGGER.info("总时间消耗:" + (System.currentTimeMillis() - startTime));
    }

    public static void main(String[] args) {
        LinkedList<Integer> linkedNodes = new LinkedList<>();
        for (int i = -1; i < 1000000; i++) {
            linkedNodes.add(i);
            if (i<0||i % 5 == 0 || i % 2 == 0 || i % 3 == 0) continue;
            linkedNodes.add(i);
            linkedNodes.add(i);
            linkedNodes.add(i);
        }
//        System.out.println(linkedNodes);
        long startTime = System.currentTimeMillis();
        System.out.println(deleteDuplicateNode(linkedNodes));
//        System.out.println(deleteDuplicateNodeReturnSelf(linkedNodes));
        System.out.println("总时间消耗:" + (System.currentTimeMillis() - startTime));
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值