删除链表中重复节点

删除链表中重复节点

在一个排序链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。

例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

一定要注意算法题目中的关键字眼: 有序

思路

[外链图片转存中...(img-cRjZHmpO-1580492185168)]

遍历整个链表,当前节点的值与下一节点值相同,那么他就是重复的节点,可以被删除

为了保证删除之后的链表仍然是项链的,我们要把当前节点的前一个节点和后面值比当前节点值大的节点相连接,我们要确保preNode始终与下一个没有重复的节点连接在一起

package B链表;

import java.util.HashSet;
import java.util.Iterator;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/1/31 0031  23:47

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,
重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

 */
public class Problem3 {

    public static void main(String[] args) {

        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3= new ListNode(3);
        ListNode listNode4 = new ListNode(3);
        ListNode listNode5= new ListNode(4);
        ListNode listNode6= new ListNode(4);
        ListNode listNode7= new ListNode(4);
        ListNode listNode8= new ListNode(4);
        ListNode listNode9= new ListNode(5);

        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode4;
        listNode4.next = listNode5;
        listNode5.next = listNode6;
        listNode6.next = listNode7;
        listNode7.next = listNode8;
        listNode8.next = listNode9;

        ListNode head = Problem3.deleteDuplication2(listNode1);
        head.list();


    }

//    /**
//     * 使用HashSet:这种方法
//     * @param pHead
//     * @return
//     */
//    public static ListNode deleteDuplication1(ListNode pHead) {
//
//        HashSet<Integer> hashSet = new HashSet<>();
//
//        ListNode temp = pHead;
//        //加入到Set中
//        while(temp.next!=null){
//            hashSet.add(temp.val);
//            temp=temp.next;
//        }
//
//        Iterator<Integer> itr = hashSet.iterator();
//        Integer value = itr.next();
//        ListNode head = new ListNode(value);
//        ListNode temp1 = head;
//
//        while(itr.hasNext()){
//            value = itr.next();
//            ListNode node = new ListNode(value);
//            temp1.next = node;
//            temp1 = node;
//        }
//        return head;
//    }


    //使用辅助变量两两比较
    public static ListNode deleteDuplication2(ListNode pHead){
        //定义三个辅助指针
        //这个指针用于删除节点
        ListNode temp1 = pHead;
        //下面两个指针用于遍历链表进行比较从而删除指针
        ListNode temp2 = pHead.next;
        ListNode temp3 = pHead.next.next;


        while(temp3!=null){
            //有相等的数据
            if(temp2.val==temp3.val){
                //一个相等的数据删完
                int val = temp2.val;
                while(temp3!=null && temp3.val==val){
                    temp1.next = temp3.next;
                    temp3 = temp3.next;
                }

                temp2 = temp3;
                temp3 = temp3.next;

            }else {//不是相等的数据,所有指针超前移动一位
                temp1 = temp1.next;
                temp2 = temp2.next;
                temp3 = temp3.next;
            }


        }
        //返回头节点
        return  pHead;

    }






}

class ListNode {

    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }

    public void list(){

        ListNode temp = this;
        while(temp!=null){
            System.out.println(temp.val);
            temp = temp.next;
        }


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值