【链表】-Lc83-删除有序链表中的重复元素(快慢双指针,slow,fast)

写在前面

  最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。



一、场景描述

  删除有序链表中的重复元素。

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

二、具体步骤

1.环境说明

名称 说明
IntelliJ IDEA 2019.2

2.代码

以下为Java版本实现:

public class Lc83_deleteDuplicates {
   

    public static void main(String[] args) {
   
        ListNode n5 = new ListNode(5);
        ListNode n31 = new ListNode(3, n5);
        ListNode n3 = new ListNode(3, n31);
        ListNode n2 = new ListNode(2, n3);
        ListNode head = new ListNode(1, n2);

        ListNode.print(head);

        System.out.println();

        ListNode.print(deleteDuplicates(head));
    }

    /**
     * 约束条件:有序链表
     * 返回值:链表
     *
     * 注意条件判断
     *
     * 思路:
     * 有序链表,那么重复的值就会紧挨着
     *
     * 使用快慢双指针,
     * 如果值相等,fast就往后去找不相等的值
     * 当值不相等时,就把 fast 的值给 slow.next,然后2个指针同时向后移动
     *
     * 循环结束,慢指针和后面的节点断开
     *
     * 定义 slow = head, fast = head.next
     * while循环
     * if (fast != null) slow.next = fast; slow = slow.next
     * fast = fast.next
     *
     * slow.next = null
     *
     * @param head
     * @return
     */
    private static ListNode deleteDuplicates(ListNode head) {
   
        if (head == null) {
   
            return null;
        }

        if (head.next == null) {
   
            return head;
        }

        ListNode slow = head, fast = head.next;
        while (fast != null) {
   
            if (slow.val != fast.val) {
   
                slow.next = fast;
                slow = slow.next;
            }

            fast = fast.next;
        }

        slow.next = null;
        return head;
    }


    static class ListNode {
   
        int val;
        ListNode next;

        public ListNode() {
   
        }

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

        public ListNode(int val, ListNode next) {
   
            this.val = val;
            this.next = next;
        }

        public static void print(ListNode head) {
   
            while (head != null) {
   
                if (head.next == null) {
   
                    System.out.print(head.val);
                } else {
   
                    System.out.print(head.val + ", ");
                }
                head = head.next;
            }
        }
    }
}

写在后面

  如果本文内容对您有价值或者有启发的话,欢迎点赞、关注、评论和转发。您的反馈和陪伴将促进我们共同进步和成长。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-05 10:46:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-05 10:46:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-05 10:46:01       87 阅读
  4. Python语言-面向对象

    2024-02-05 10:46:01       96 阅读

热门阅读

  1. Transformer的PyTorch实现之若干问题探讨(一)

    2024-02-05 10:46:01       58 阅读
  2. 网课:[SCOI2005]扫雷MINE——牛客(题解)

    2024-02-05 10:46:01       46 阅读
  3. 使用PySpark处理DataFrame以拆分数组列

    2024-02-05 10:46:01       51 阅读
  4. 初入软件测试行业,探寻成功之路

    2024-02-05 10:46:01       45 阅读
  5. linux c获取pid tid的几种方式

    2024-02-05 10:46:01       49 阅读
  6. MySQL 函数触发隐式转换应对策略

    2024-02-05 10:46:01       48 阅读
  7. “网络爬虫”是什么,他的原理是什么?

    2024-02-05 10:46:01       51 阅读
  8. 前端代码规范

    2024-02-05 10:46:01       52 阅读
  9. Pytorch: torch.linspace等间隔数值函数

    2024-02-05 10:46:01       51 阅读
  10. Lets-Encrypt配置泛域名证书

    2024-02-05 10:46:01       55 阅读
  11. Oracle常用命令

    2024-02-05 10:46:01       42 阅读
  12. 用爬虫自建行业知识库

    2024-02-05 10:46:01       44 阅读