算法:在有序的链表中删除掉所有重复的数据(包括重复本身的节点)Remove Duplicates from Sorted List II
题目
82. Remove Duplicates from Sorted List II
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
Return the linked list sorted as well.
Example 1:
Input: 1->2->3->3->4->4->5
Output: 1->2->5
Example 2:
Input: 1->1->1->2->3
Output: 2->3
定义公用的链表
用于打印链表数据
package common;public class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val = val;}static public ListNode listNodeWithIntArray(int[] input) {ListNode head = new ListNode(0);ListNode node = head;for (int i: input) {ListNode newNode = new ListNode(i);node.next = newNode;node = node.next;}return head.next;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();ListNode node = this;while (node != null) {sb.append(node.val).append("-->");node = node.next;}return sb.append("Null").toString();}@Overridepublic boolean equals(Object obj) {if (this == obj) {return true;}return false;}
}
遍历解法
思路:
- 用快慢两个指针,慢指针指着上一个节点,快指针找出下一个不重复的节点;
- 如果找到重复的节点,则慢指针的下一个节点就不等于当前快指针
if (slow.next != fast)
,那慢指针就指向快指针的下一个值;也就是下一个不重复的值; - 如果没找到重复的节点,则都指向下一个节点;
- 无论是否找到重复的节点,快指针都要指向下一个节点
fast = fast.next;
package linkedlist;import common.ListNode;public class RemoveDuplicatesFromSortedListII {public ListNode deleteDuplicates(ListNode head) {//check edgeif (head == null || head.next == null) {return head;}ListNode dummy = new ListNode(0);ListNode slow = dummy;ListNode fast = head;slow.next = fast;while (fast != null) {while (fast.next != null && fast.val == fast.next.val) {fast = fast.next; // while loop to find the last duplicate item}// find duplicateif (slow.next != fast) {slow.next = fast.next; // remove the duplicate items} else {slow = slow.next; // move down next point}fast = fast.next;}return dummy.next;}
}
递归解法
递归的思路就是翻译了遍历的做法。
- 如果当前节点不是唯一节点,则递归调用指向下一个节点。
- 如果当前节点是唯一节点,则用当前节点指向,递归调用的下一个节点。
package linkedlist;import common.ListNode;public class RemoveDuplicatesFromSortedListII {/*** if current node is not unique, return deleteDuplicates with head.next.* If current node is unique, link it to the result of next list made by recursive call. Any improvement?* @param head* @return*/public ListNode deleteDuplicatesWithRecursive(ListNode head) {if (head == null) {return head;}if (head.next != null && head.val == head.next.val) {while (head.next != null && head.val == head.next.val) {head = head.next;}return deleteDuplicatesWithRecursive(head.next);} else {head.next = deleteDuplicatesWithRecursive(head.next);}return head;}
}
算法:在有序的链表中删除掉所有重复的数据(包括重复本身的节点)Remove Duplicates from Sorted List II相关推荐
- 数据结构例1.已知顺序表L的长度为n,试编写算法实现在顺序表中删除值为elem的数据元素
//已知顺序表L的长度为n,试编写算法实现在顺序表中删除值为elem的数据元素 //(其中n与elem从键盘输入) # include <iostream> # include <s ...
- leetcode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)
目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3-& ...
- 删除排序数组中的重复数字 II · Remove Duplicates from Sorted Array II
重复一次 [抄题]: 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. [思维问题]: [ ...
- lintcode :Remove Duplicates from Sorted Array II 删除排序数组中的重复数字 II
题目: 删除排序数组中的重复数字 II 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 样例 给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A ...
- [Leetcode] Remove duplicates from sorted array ii 从已排序的数组中删除重复元素
Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For examp ...
- 删除重复值(2以上)Remove Duplicates from Sorted Array II
2019独角兽企业重金招聘Python工程师标准>>> 问题: Follow up for "Remove Duplicates": What if duplic ...
- 无头结点单链表的逆置_从无头单链表中删除节点及单链表的逆置
题目: 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(非第一个节点, 也非最后一个节点).请将该节点从单链表中删除. 解答: 典型的"狸猫换太子", 若要删除该 ...
- 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点...
题目 在单链表和双链表中删除倒数第K个节点 java代码 /*** @Description:在单链表和双链表中删除倒数第K个节点* @Author: lizhouwei* @CreateDate: ...
- 从无头单链表中删除节点 结构之法 4
题目: 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个节点),请将该节点从单链表中删除. 分析与解答: 假设给定的指针为pCurrent,Node *pN ...
- 编程之美-从无头单链表中删除节点方法整理
[试题描述] 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个),请将该节点从单链表中删除. 程序:
最新文章
- 跳出数据计算拯救人工智能之分布式逻辑
- JavaScript性能优化 DOM编程
- 新浪短链api java_php调用新浪短链接API的方法
- Fuzzy c-means (FCM)聚类算法
- 单点登录总结(域名内与跨域名)
- 为什么Java不允许super.super.method();
- 【LeetCode笔记】46. 全排列(Java、DFS回溯、队列)
- mysql的主从(AB)复制
- 华为设备网络故障排错实验
- 扎心实战案例:麻(shi)雀(zhan)虽小,五脏俱全
- 怎么判断间隙过渡过盈配合_圆柱销有2个标准,选型注意材料和热处理,特别是销孔的配合关系...
- python如何制作一个任意列表_我要悄悄学Python之列表(一)
- 3D美术14——max——fbx导入max后直接生成bip人形骨骼插件
- Java的随机数原理
- netty pipeline 执行顺序解读
- 固态变 SATAFIRM S11
- jQuery中的基本选择器,id,class,元素,通用
- 从现在,看未来---Linux Kernel 未来发展方向
- 盘点最常用的几款linux服务器管理面板
- rk3288 android7.1 蓝牙传送文件失败
热门文章
- php pdo exec,PDO::exec
- java中a 和 a_Java中的a++和++a的区别 | 学步园
- 布局篇(1)—If you love css …
- linux、mysql、nginx、tomcat 环境下压力测试的主要调试参数
- artDialog双击会关闭对话框的修改
- Java定时任务的三种实现方法
- lduan server 2012 RMS 群集安装 上(十四)
- centos 6.5 找回root密码的方法
- 【权值分块】bzoj1588 [HNOI2002]营业额统计
- Acwing:最长回文子串