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

写在前面

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


目录

  • 写在前面
  • 一、场景描述
  • 二、具体步骤
    • 1.环境说明
    • 2.代码
  • 写在后面


一、场景描述

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

示例:
输入: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;
            }
        }
    }
}

写在后面

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

你可能感兴趣的:(数据结构与算法,链表,数据结构)