java删除链表中重复的结点

1.题目

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

2.分析

  1. 重复的节点不止一个;排好序,又有重复的结点,那么结点肯定挨着的。、
  2. 定义cur指向头结点;定义一个中间结点newHead,定义一个引用tmp指向这个节点,所有不重复的结点就挂在这个节点后面。
  3. cur不为空就进入循环,当cur.next!=null,并且cur.val==cur.next.val,进入循环,当cur.next!=null,并且cur.val==cur.next.valcur=cur.next;
  4. cur.next!=null,并且cur.val==cur.next.val不成立时候,tmp.next = cur;tmpcur向后移动,
  5. 最后防止最后一个节点也是重复的,应该tmp.next = null;
  6. 最后返回头结点return newHead.next

3.具体步骤

最后一个结点不重复:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后一个结点是重复的结点,如果上面的例子最后一个56也是34:

在这里插入图片描述

4.代码

 //删除链表中重复的结点
    public ListNode deleteDuplication() {
    
    
        ListNode cur = head;
        ListNode newHead = new ListNode(-1);
        ListNode tmp = newHead;
        while (cur != null) {
    
    
            if (cur.next != null && cur.val == cur.next.val) {
    
    
                while (cur.next != null && cur.val == cur.next.val) {
    
    
                    cur = cur.next;
                }
                cur = cur.next;
            } else {
    
    
                tmp.next = cur;
                tmp = tmp.next;
                cur = cur.next;
            }
        }
        //防止最后一个节点也是重复的
        tmp.next = null;
        return newHead.next;
    }

测试:

  public static void main(String[] args) {
    
    
        MyLinkedList myLinkedList1 = new MyLinkedList();
        myLinkedList1.addLast(12);
        myLinkedList1.addLast(23);
        myLinkedList1.addLast(34);
        myLinkedList1.addLast(34);
        myLinkedList1.addLast(56);
        System.out.println("myLinkedList1:");
        myLinkedList1.display();

        myLinkedList1.deleteDuplication();
        System.out.println("删除重复结点:");
        myLinkedList1.display();

    }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44721738/article/details/121183372

相关文章