面试题18-题目二:删除链表中重复的节点

/*

 * 面试题18-题目二:删除链表中重复的节点

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

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

 * 思路:先新建一个头节点,然后向后查找值相同的节点,重复查找后删除

 */

public class No18deleteDuplication {

 

    public static void main(String[] args) {

       No18deleteDuplication n = new No18deleteDuplication();

       ListNode p1 = new ListNode(1);

       ListNode p2 = new ListNode(2);

       ListNode p3 = new ListNode(3);

       ListNode p33 = new ListNode(3);

       ListNode p4 = new ListNode(4);

       ListNode p44 = new ListNode(4);

       ListNode p5 = new ListNode(5);

      

       p1.next = p2;

       p2.next = p3;

       p3.next = p33;

       p33.next = p4;

       p4.next = p44;

       p44.next = p5;

       ListNode ln = n.deleteDuplication(p1);

                System.out.println(ln.val);

                System.out.println (ln.next.val);

                System.out.println (ln.next.next.val);

 

       

    }

 

    public ListNode deleteDuplication(ListNode pHead) {

       if (pHead == null) {

           return null;

       }

        // 新建一个节点,防止头结点被删除

       ListNode first = new ListNode(-1);

       first.next = pHead;

       ListNode p = pHead;

       // 指向前一个节点

       ListNode preNode = first;

      

       while (p != null && p.next != null) {

           if (p.val == p.next.val) {

              int val = p.val;

               // 向后重复查找

              while (p != null && p.val == val) {

                  p = p.next;

              }

              // 上个非重复值指向下一个非重复值:即删除重复值

              preNode.next = p;

           } else {// 如果当前节点和下一个节点值不等,则向后移动一位

              preNode = p;

              p = p.next;

           }

       }

       return first.next;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值