leetcode83. 删除排序链表中的重复元素

导读:本篇文章讲解 leetcode83. 删除排序链表中的重复元素,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

题目

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

示例 1:
在这里插入图片描述

输入:head = [1,1,2]
输出:[1,2]
示例 2:

输入:head = [1,1,2,3,3]
输出:[1,2,3]

提示:

链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列

分析

由题可知:在链表中有相同值的节点是相邻的

解法一:递归
1、终止条件:为空
2、应该返回的值:当前链表头节点
3、递归的每一步在干嘛(【误区】不要想压栈,每一个栈在干嘛):判断相邻节点是否相等,相等直接指向下一个

解法二:迭代(能递归必能迭代)
循环迭代,判断相邻节点是否重复

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        // 解法一:递归
        // return deleteDuplicates01(head);

        // 方法二:迭代法
        return deleteDuplicates02(head);
    }
    /**
        解法一:使用递归的方法
     */
    private static ListNode deleteDuplicates01(ListNode head){
        if(head==null||head.next==null){
            return head;
        }
        // 递归每一步要干什么
        head.next=deleteDuplicates01(head.next);
        if(head.val==head.next.val){
            // 当前头节点指向,头节点的下一个位置
            head=head.next;
        }
        return head;
    }

    /**
        解法二:迭代
     */
      private static ListNode deleteDuplicates02(ListNode head){
          // 定义一个指针
          ListNode p=head;
          while(p!=null&&p.next!=null){
              if(p.val==p.next.val){
                  // 前后节点相等
                  // 将前一个节点的后后两个节点进行赋值
                  // 这个时候不需要指针后移,他要继续重当前节点去遍历
                  p.next=p.next.next;
              }else{
                  p=p.next;
              }
          } 
          return head;
      }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/96232.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!