删除链表中重复的节点Java实现,剑指Offer面试题18

常规链表应用


/**
 * 删除重复的节点
 * 用的指针比较多,注意程序的鲁棒性
 */
public class Main18 {
    public ListNode deleteDuplication(ListNode pHead) {

        //若头指针为null,直接返回
        if(pHead == null) {
            return null;
        }
        //定义不重复的上一个节点和遍历节点
        ListNode preNode = null;
        ListNode Node = pHead;
        //当前遍历的节点不为空
        while (Node != null){
            //标记这次遍历是否有遇到重复的元素
            boolean delete = false;
            //跟下一个节点比较,
            if (Node.next != null && Node.val == Node.next.val){
//                遇到重复的节点,更改标记
                delete = true;
            }
//            如果没有标记,则指向下一个节点
            if (!delete){
                preNode = Node;
                Node = Node.next;
            }else{
//                如果有标记,记录该重复节点的值,把后面相同值的节点都找到,一次性都删除
                int val = Node.val;
                while (Node != null && val == Node.val){
                    Node = Node.next;
                }
                //判断这时候上一个不重复节点是否为空,如果为空说明头节点也被删除了,这时候要重新赋予头节点值
                if (preNode == null){
                    pHead = Node;
                }else {
                    //若头节点未被删除,则指向当前节点
                    preNode.next = Node;
                }
            }
        }
        return pHead;

    }
}

猜你喜欢

转载自blog.csdn.net/aa792978017/article/details/89193781