83—删除链表中重复的元素

题目

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:
输入: 1->1->2
输出: 1->2
示例 2:

输入: 1->1->2->3->3
输出: 1->2->3

有两种解法,一种是迭代,使用双指针,另一种是递归。
双指针就是定义快慢指针,快指针与慢指针指向的值进行比较,如果两个的val相等代表两个元素重复,将慢指针的next指向快指针的next,如果不相等,两个指针都往后移动,直到快指针为空。

递归解法:结束条件时head为null或者head.next为null,递归的返回值代表以head开头的链表是一个有序不重复的链表,所以,如果两个元素重复,最终返回head,如果不重复,继续递归下一个节点;

代码

//快慢指针解法
    public ListNode deleteDuplicates(ListNode head) {
    
    
        if(head==null||head.next==null) return head;
        ListNode pre = new ListNode(0);
        pre.next = head;
        ListNode cur = head.next;
        ListNode slow = head;
        while(cur!=null){
    
    
            if(slow.val==cur.val){
    
    
                //如果相邻的两个节点的值相等,说明是重复元素,慢指针指向的节点的next=他next.next
                //之后快指针往后移动
                slow.next = cur.next;
                cur = cur.next;
            }else{
    
    
                //如果不相等,快指针和慢指针都往后移动
                slow = slow.next;
                cur = cur.next;
            }
        }
        return pre.next;
    }

递归

 //递归解法
    public ListNode deleteDuplicates(ListNode head) {
    
    
        if(head==null||head.next==null) return head;
        if (head.val == head.next.val){
    
    
            head = deleteDuplicates(head.next);
        }else{
    
    
            head.next = deleteDuplicates(head.next);
        }
        return head;
    }

おすすめ

転載: blog.csdn.net/qq_43672652/article/details/110791732