牛客网-删除链表中重复的节点
时间:2022-07-22
本文章向大家介绍牛客网-删除链表中重复的节点,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
OJ链接:https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef
解法1 带头节点的解法
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead){
if(pHead == null)
return pHead;
//为了简单,构造一个有头结点的链表
ListNode head = new ListNode(0);
head.next = pHead;//带头节点的链表的next指向pHead,我们返回的时候就返回head.next即可
//prev永远在last的前面
ListNode prev = head;//前指针 目的:永远指向的是重复节点的前一个节点,为了方便删除
ListNode last = prev.next;//后指针
while(last!=null ){
//1、,先找到重复的开始
//如果last和last.next不相等,就一直让prev和last往后走
while(last.next != null && last.val!= last.next.val){
prev = prev.next;
last = last.next;
}
//2、再找到重复的范围
//如果last和last.next相等,就让last一直往后走,找和last.val相等的
while(last.next != null && last.val == last.next.val){
last=last.next;
}
//走到这里,结果一共有三种情况。注意:prev永远指向的是前驱有效起始节点:
/*
走到这里就构成了一个:(prev,last] 的区间
1、last.next != null 并且prev到last是一段重复的范围,prev.next=last.next
2、last.next == null 并且prev到last是一段重复的范围,prev.next=last.next(null)
3、last.next == null 整张链表没有重复节点
*/
if(prev.next != last){
prev.next = last.next;
}
//走到这一步,就是为了保证恢复和最开始一致
last = last.next;
}
//因为要把头节点给省略,所以这样做
return head.next;
}
}
- 编程的智慧特点
- 【机器学习】机器学习大白话
- 回归分析技术|机器学习
- 用PHP蜘蛛做旅游数据分析
- 一秒找出用时间和随机数生成的上传文件名
- Java之集合的遍历与迭代器
- Java之字符串String,StringBuffer,StringBuilder
- JavaScript深入浅出补充——(一)数据类型,表达式和运算符
- Oracle数据库(一)概述、基础与简单操作
- Oracle数据库(二)常用关键字以及函数
- Oracle数据库(三)表操作,连接查询,分页
- 正式学习第一天下午——基础标签及其属性
- 正式学习第二天上午——常用标签及列表 0605
- Java之面向对象例子(三) 多态,重写,重载,equals()方法和toString()方法的重写
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 4-1 R语言函数 lapply
- 4-2 R语言函数 apply
- 4-3 R语言函数 mapply
- 4-4 R语言函数 tapply
- 4-5 R语言函数 split
- 4-6 R语言函数 排序
- 4-7 总结数据信息
- Linux系统——zabbix监控软件安装布署
- 1.4 Installation and Setup(安装和设置)
- Linux系统VIM编辑器常用操作介绍
- 1.6 Navigating This Book(本书导航)
- 2.1 The Python Interpreter(python解释器)
- Linux系统—Centos7安装教程
- 2.2 IPython基础
- Linux系统crond、rsync、打包备份数据操作实战