博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
链表算法面试题---删除链表中的重复元素II
阅读量:2509 次
发布时间:2019-05-11

本文共 2953 字,大约阅读时间需要 9 分钟。

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。

举例:

原链表: 1->2->3->3->4->4->5
删除后: 1->2->5

解法1:

结合删除重复节点和删除指定节点的方式,可以先删除重复节点,并记录下来重复节点的值,然后再删除指定节点的值即可。

public class Code_06 {
public static void main(String[] args) {
Code_06 c = new Code_06(); ListNode n = new ListNode(); ListNode head = n; for (int i = 1; i <= 5; i++) {
n.next = new ListNode(i); n = n.next; if (i % 2 == 0) {
n.next = new ListNode(i); n = n.next; } } System.out.println(head); System.out.println(c.deleteDuplicates(head)); } public ListNode deleteDuplicates(ListNode head) {
ListNode cur = head; Set
dupSet = new HashSet<>(); while (cur != null && cur.next != null) {
if (cur.val != cur.next.val) {
cur = cur.next; } else {
dupSet.add(cur.val); cur.next = cur.next.next; } } for (Integer val : dupSet) {
head = deleteNode(head, val); } return head; } private ListNode deleteNode(ListNode head, int val) {
while (head != null) {
if (head.val != val) {
break; } head = head.next; } ListNode pre = null; ListNode cur = head; while (cur != null) {
if (cur.val == val) {
pre.next = cur.next; } else {
pre = cur; } cur = cur.next; } return head; }}

第一种方式显然不够优雅,换一种思路,通过哑节点+双指针实现

public class Code_06_01 {
public static void main(String[] args) {
Code_06_01 c = new Code_06_01(); ListNode n = new ListNode(); ListNode head = n; for (int i = 1; i <= 5; i++) {
n.next = new ListNode(i); n = n.next; if (i % 2 == 0) {
n.next = new ListNode(i); n = n.next; } } System.out.println(head); System.out.println(c.deleteDuplicates(head)); } /** * 哑节点+双指针 *

* 构建一个哑节点,让其next指向头位置。 * 再利用双指针,n1,n2,初始都指向head位置,如果n1.next.val==n2.next.val,则让n2向前移动一位,否则n1,n2一起向前移动一位 * * @param head * @return */ public ListNode deleteDuplicates(ListNode head) {

ListNode dummy = new ListNode(); dummy.next = head; ListNode n1 = dummy; ListNode n2 = head; while (n2 != null && n2.next != null) {
if (n1.next.val != n2.next.val) {
n1 = n1.next; } else {
//n2一直移动,直到不等于n1为止 while (n2 != null && n2.next != null && n1.next.val == n2.next.val) {
n2 = n2.next; } n1.next = n2.next; } n2 = n2.next; } return dummy.next; }}

转载地址:http://uhlrb.baihongyu.com/

你可能感兴趣的文章
期货市场技术分析05_交易量和持仓兴趣
查看>>
TB交易开拓者入门教程
查看>>
TB创建公式应用dll失败 请检查用户权限,终极解决方案
查看>>
python绘制k线图(蜡烛图)报错 No module named 'matplotlib.finance
查看>>
talib均线大全
查看>>
期货市场技术分析06_长期图表和商品指数
查看>>
期货市场技术分析07_摆动指数和相反意见理论
查看>>
满屏的指标?删了吧,手把手教你裸 K 交易!
查看>>
不吹不黑 | 聊聊为什么要用99%精度的数据回测
查看>>
对于模拟交易所引发的思考
查看>>
高频交易的几种策略
查看>>
量化策略回测TRIXKDJ
查看>>
量化策略回测唐安奇通道
查看>>
CTA策略如何过滤部分震荡行情?
查看>>
量化策略回测DualThrust
查看>>
量化策略回测BoolC
查看>>
量化策略回测DCCV2
查看>>
mongodb查询优化
查看>>
五步git操作搞定Github中fork的项目与原作者同步
查看>>
git 删除远程分支
查看>>