面试题 02.01. 移除重复节点

题目来源

面试题 02.01. 移除重复节点

题目描述

面试题 02.01. 移除重复节点_第1张图片

题目解析

set

使用set或者hash表,头插法

  • 遍历链表,如果链表中的值出现过,直接进入下一个节点
  • 如果当前节点值没有出现过,加入set、使用当前节点值创建一个节点,挂载到新链表上
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
     
    public static ListNode removeDuplicateNodes(ListNode head) {
     
        Set<Integer> set = new HashSet<>();
        ListNode pre = new ListNode(-1);
        ListNode cur = pre;
        while (head != null){
     
            if (!set.contains(head.val)){
     
                cur.next = new ListNode(head.val);
                cur = cur.next;
                set.add(head.val);
            }
            head = head.next;
            
        }


        return pre.next;
    }
}

在这里插入图片描述

不使用临时缓冲区

本来想使用暴力的,但是暴力可以优化

冒泡排序的思想: 渐渐扩大不重复的区域

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
     
    public  ListNode removeDuplicateNodes(ListNode head) {
     
        if (head == null){
     
            return null;
        }
        
        
        ListNode fisrt = head;
        while (fisrt != null){
     
            ListNode second = fisrt; // second初始时一定和first相等,之和就一定不相等了
            // second左边的区域一定和first的值不相等
            while (second.next != null){
       // 如果second右边还有区域没有比较
                if (second.next.val == fisrt.val){
      // 那么比较second为比较区的最左边的值是否与first.val是否相等
                    second.next = second.next.next;  // 如果相等,干掉这个节点
                }else {
     
                    second = second.next; // 如果不相等,扩大不重复区域
                }
            }
            fisrt = fisrt.next;
        }


        return head;
    }

}

疑问:是否可以梳子排序优化
在这里插入图片描述

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