【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 题目描述在一个排序的链表中,存在重复的结点,请删除该链表中 ...
随机推荐
- 【Java例题】1.2计算n的m次方
package study; import java.util.*; import java.math.*; public class study { public static void main( ...
- QT状态机
首先吐槽下网上各种博主不清不楚的讲解 特别容易让新手迷惑 总体思想是这样的:首先要有一个状态机对象, 顾名思义,这玩意就是用来容纳状态的.然后调用状态机的start()函数它就会更具你的逻辑去执行相关 ...
- [TCP/IP]DNS解析
DNS解析主机的IP地址 host -t A www.baidu.com
- ASP.NET Core MVC 之控制器(Controller)
操作(action)和操作结果(action result)是 ASP.NET MVC 构建应用程序的一个基础部分. 在 ASP.NET MVC 中,控制器用于定义和聚合一组操作.操作是控制器中处理传 ...
- c# 三步递交模式调用同一个存储过程
主要用于批量的sql操作:第一步创建中间表,第二步多次写数据到中间表,第三步 提交执行 创建三步递交的存储过程: CREATE PROC usp_testsbdj@bz int=0,@name VAR ...
- centos7通过yum安装docker
##yum源安装#1.更新yumyum update #2.删除旧版本yum remove docker \docker-client \docker-client-latest \docker-co ...
- 源码分析Retrofit请求流程
Retrofit 是 square 公司的另一款广泛流行的网络请求框架.前面的一篇文章<源码分析OKHttp执行过程>已经对 OkHttp 网络请求框架有一个大概的了解.今天同样地对 Re ...
- MySQL隔离性及Spring事务
一.数据库事务ACID特性 必须要掌握事务的4个特性,其中事务的隔离性之于MySQL,对应4级隔离级别. 原子性(Atomicity): 事务中的所有原子操作,要么都能成功完成,要么都不完成,不能停滞 ...
- zabbix利用自带模板-监控mysql性能
环境: zabbix3.4.4 mariadb 5.5.56 要求: 利用zabbix 自带的模板 监控mariadb 上的 并发连接数,慢查询数量,增删改查.请求流量带宽,mysql响应流量带宽等 ...
- mysql------explain工具
基于mysql5.7,innodb存储引擎 使用explain关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL ...