【Offer】[18-2] 【删除链表中重复的节点】
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路分析
由于是有序链表,要删除重复节点,,我们可以先设置三个指针,pre,p,next,分别指向前一个节点,当前节点,和下一个结点,遍历链表,判断当前节点和下一个结点是否相同,设置一个标记位needDel
:
1. 如果没有找到,就想指针往后移动;
2. 否则,就设置true,这时可以循环遍历往后继续搜索重复的节点(因为链表是有序的)
注意:
- 删除的是第一个节点的情况
- 传入头结点为null时,或者只有头结点
测试用例
要注意此题返回的是头指针
- 功能测试(重复结点位于链表头部、中部、尾部,无重复结点)
- 特殊测试(null,所有结点均重复)
Java代码
package com.hao.offer;
import com.hao.common.ListNode;
public class Offer18_02 {
public static void main(String[] args) {
System.out.println("****功能测试***");
test1();
System.out.println("***特殊输入测试****");
test2();
System.out.println("***特殊输入测试****");
test3();
}
public static ListNode deleteDuplication(ListNode pHead) {
return Solution1(pHead);
}
/**
*
* 需要设置三个指针,pre pNode 和 next ;
*
* @param pHead
* @return
*/
private static ListNode Solution1(ListNode pHead) {
if (pHead == null || pHead.next == null) {// 如果链表为空,或者已有一个节点
return pHead;
}
ListNode pre = null;
ListNode pNode = pHead; // 代表当前节点
while (pNode != null) {// 从头指针开始遍历链表
boolean needDel = false;
ListNode pNext = pNode.next;
if (pNext != null && pNext.val == pNode.val) {
// 如果当前节点的下一个结点不为null 且其值和当前节点相等
needDel = true;
}
if (!needDel) {// 如果没有找到重复的元素就将指针往后移动
pre = pNode;
pNode = pNode.next;
} else { // 找到重复的元素
ListNode toBeDel = pNode;
int value = toBeDel.val;
while (toBeDel != null && toBeDel.val == value) {
// 将指针移到所有重复元素的后面
toBeDel = toBeDel.next;
}
if (pre == null) {// 删除的是第一个节点
pHead = toBeDel;
} else {
pre.next = toBeDel;
}
pNode = toBeDel;
}
}
return pHead;
}
/**
* 功能测试 要注意此题目没有头结点
*/
private static void test1() {//
System.out.println("有两对重复的");
ListNode node6 = new ListNode(6, null);
ListNode node5 = new ListNode(6, node6);
ListNode node4 = new ListNode(3, node5);
ListNode node3 = new ListNode(3, node4);
ListNode node2 = new ListNode(2, node3);
ListNode node1 = new ListNode(1, node2);
ListNode pHead = new ListNode(0, node1);
System.out.println("删除之前");
printListNode(pHead);
System.out.println("删除之后--->");
deleteDuplication(pHead);
printListNode(pHead);
}
/**
* 特殊值输入测试
*/
private static void test2() {//
System.out.println("所有的元素都是重复的");
ListNode node6 = new ListNode(2, null);
ListNode node5 = new ListNode(1, node6);
ListNode node4 = new ListNode(1, node5);
ListNode node3 = new ListNode(1, node4);
ListNode node2 = new ListNode(1, node3);
ListNode node1 = new ListNode(1, node2);
ListNode pHead = new ListNode(1, node1);
System.out.println("删除之前");
printListNode(pHead);
System.out.println("删除之后--->");
deleteDuplication(pHead);
printListNode(pHead);
}
private static void test3() {
System.out.println("只有一个节点");
ListNode pHead = new ListNode(1, null);
System.out.println("删除之前");
printListNode(pHead);
System.out.println("删除之后--->");
deleteDuplication(pHead);
printListNode(pHead);
}
/**
* 打印链表 此题目没有头结点
*
* @param pHead
*/
private static void printListNode(ListNode pHead) {
ListNode p = pHead;
while (p != null) {
System.out.print(p.val + " ");
p = p.next;
}
System.out.println();
}
}
代码链接
【Offer】[18-2] 【删除链表中重复的节点】的更多相关文章
- 剑指offer 面试题 删除链表中重复的节点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- 【剑指offer】删除链表中重复的节点,C++实现(链表)
0.简介 本文是牛客网<剑指offer>笔记. 1.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针.例如,链表1-> ...
- php实现删除链表中重复的节点
php实现删除链表中重复的节点 一.总结 二.php实现删除链表中重复的节点 题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1 ...
- 剑指offer——面试题18.1:删除链表中重复的节点
// 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...
- 剑指offer(56)删除链表中重复的节点
一直忘记更新了,把剑指offer更新完吧.... 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3-&g ...
- python实现剑指offer删除链表中重复的节点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- 第18题:在O(1)时间删除链表结点+删除链表中重复的节点
题目描述:题目描述在O(1)时间删除链表结点 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 考查创新编程能力. 思路: 1.如果从头到尾遍历,时间O(n) 2.如果将待删 ...
- 剑指offer系列30-----删除链表中重复的节点
[题目]在一个排序的链表中,存在重复的结点, * 请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. * 例如,链表1->2->3->3->4->4->5 ...
- AcWing 29. 删除链表中重复的节点
题目地址 https://www.acwing.com/problem/content/description/27/ 来源:剑指Offer 题目描述在一个排序的链表中,存在重复的结点,请删除该链表中 ...
随机推荐
- 关于AJAX的跨域问题
最近过年的这几天在做毕业设计的时候遇到了一个关于AJAX的跨域问题,本来我是想要用一下聚合数据平台提供的天气预报的接口的,然后做一个当地的天气情况展示,但是在使用AJAX的时候,被告知出现错误了. 这 ...
- 利用MAVEN打包可运行jar包,包括依赖的第三方包
转载自:http://bglmmz.iteye.com/blog/2058914 背景: 另一篇文章说了如何利用IDEA来打包,现在来说说如何利用MAVEN打包 目标:应用本身打成一个jar包,依赖的 ...
- java并发编程(十四)----(JUC原子类)对象的属性修改类型介绍
今天我们介绍原子类的最后一个类型--对象的属性修改类型: AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicReferenceFieldUp ...
- 算法与数据结构基础 - 折半查找(Binary Search)
Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...
- egg-sequelize-ts 插件
egg-sequelize-ts plugin 目的 (Purpose) 能让使用 typescript 编写的 egg.js 项目中能够使用 sequelize方法,并同时得到egg.js所赋予的功 ...
- print,cat打印格式及字符串引号格式,去掉字符串空格 in R
print 函数的打印格式: ##no quote print out > x <- letters[1:5] > print(x,quote=F,);print(x,quote=T ...
- P3195 [HNOI2008]玩具装箱TOY 斜率优化dp
传送门:https://www.luogu.org/problem/P3195 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任 ...
- 深入浅出TCP与UDP协议
深入浅出TCP与UDP协议 网络协议是每个前端工程师的必修课,TCP/IP协议族是一系列网络协议的总和,而其中两个具有代表性的传输层协议,分别是TCP与UDP,本文将介绍这两者以及他们之间的区别. 一 ...
- Nginx服务部署
1 企业常用网站服务 处理静态资源:nginx.apache.Lighttpd处理动态资源:tomcat(java语言编写).php(php语言编写).python(python语言编写)nginx网 ...
- linux环境部署,docker如何安装redis
安装步骤 1. 安装Redis 通过docker search redis和docker pull redis下载redis镜像 2. 新建挂载配置文件夹 新建data和conf两个文件夹,位置随意. ...