前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >删除有序链表中的重复元素

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

作者头像
忧愁的chafry
发布2022-10-30 15:36:43
发布2022-10-30 15:36:43
1.1K0
举报
文章被收录于专栏:个人技术笔记个人技术笔记

题目:

思路:

思路一:由于是有序的链表,所以按一定的顺序,例如从小到大,这样的话,将第一个A节点的值存于一个变量temp之中,设第一个节点为A(head),第二个节点为B(head.next),第三个节点为C(head.next.next),这样如果B的值与A相同,则就是要去掉的,即head.next=head.next.next ,第二节点的位置由第三个的值覆盖。以此类推,便能去重。

思路二:按照第一种方法固然有种简便的方式,但其中也有不少多余的步骤,例如如果ABC三者的值都相同,那么要进行两次赋值操作这明显是多余的,那么我们应该可以尝试遍历到一个不同的,然后直接将重复的一次性清除,减少开销。

思路三:如果这个有序的链表变为了无序的呢,那么明显不能只用一个变量来进行存储,这时候我们可以用set集合来进行处理,这样不管是有序还是无序其实问题都不大,但是对于这种我们又该如何减少开销,再次提高性能。

代码示例:

import java.util.HashSet;

import java.util.Set;

class ListNode {

    int val;

    ListNode next = null;

}

public class Solution {

    public static void main(String[] args) {

        ListNode head = new ListNode();

        head.val = 1;

        ListNode top = head;

        for (int i = 4; i < 6; i++) {

            ListNode temp = new ListNode();

            temp.val = i / 2;

            top.next = temp;

            top = temp;

        }

        ListNode test = head;

        while (head != null) {

            System.out.println(head.val);

            head = head.next;

        }

        System.out.println("end");

        ListNode end = deleteDuplicates2(test);

        while (end != null) {

            System.out.println(end.val);

            end = end.next;

        }

    }

    /**

     * 如果当前为无序链表,这时候可以用一个变量存储一个已经出现过的值,

     * 如果是无序的话这种就不可行了

     *

     * @param head

     * @return

     */

    public static ListNode deleteDuplicates2(ListNode head) {

        if (head == null || head.next == null) //排除传输一个null的链表或者只有一个元素的链表

            return head;

        Set set = new HashSet();        //使用set集合,这样用于判断元素是否已经存在于集合中,且不会存储重复的值

        ListNode next_temp = head;      //头指针

        set.add(next_temp.val);

        while (next_temp != null && next_temp.next != null) {

            if (set.contains(next_temp.next.val)) {

                next_temp.next = next_temp.next.next;

            } else {

                set.add(next_temp.next.val);

                next_temp = next_temp.next;

            }

        }

        return head;

    }

    /**

     * 仅当是当前为有序链表,即按一定的顺序,这时候可以用一个变量存储一个已经出现过的值,

     * 如果是无序的话这种就不可行了

     *

     * @param head

     * @return

     */

    public static ListNode deleteDuplicates1(ListNode head) {

        if (head == null || head.next == null) //排除传输一个null的链表或者只有一个元素的链表

            return head;

        int temp_val = head.val;

        ListNode next_temp = head;      //头指针

        while (next_temp != null && next_temp.next != null) {

            if (next_temp.next.val != temp_val) {

                temp_val = next_temp.next.val;

                next_temp = next_temp.next;

            } else {

                next_temp.next = next_temp.next.next;

            }

        }

        return head;

    }

}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目:
  • 思路:
  • 代码示例:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档