题目描述

  在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

思路分析

  由于是有序链表,要删除重复节点,,我们可以先设置三个指针,pre,p,next,分别指向前一个节点,当前节点,和下一个结点,遍历链表,判断当前节点和下一个结点是否相同,设置一个标记位needDel
  1. 如果没有找到,就想指针往后移动;
  2. 否则,就设置true,这时可以循环遍历往后继续搜索重复的节点(因为链表是有序的)
注意:

  1. 删除的是第一个节点的情况
  2. 传入头结点为null时,或者只有头结点

测试用例

要注意此题返回的是头指针

  1. 功能测试(重复结点位于链表头部、中部、尾部,无重复结点)
  2. 特殊测试(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代码-Java

【Offer】[18-2] 【删除链表中重复的节点】的更多相关文章

  1. 剑指offer 面试题 删除链表中重复的节点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  2. 【剑指offer】删除链表中重复的节点,C++实现(链表)

    0.简介       本文是牛客网<剑指offer>笔记. 1.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针.例如,链表1-> ...

  3. php实现删除链表中重复的节点

    php实现删除链表中重复的节点 一.总结 二.php实现删除链表中重复的节点 题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1 ...

  4. 剑指offer——面试题18.1:删除链表中重复的节点

    // 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...

  5. 剑指offer(56)删除链表中重复的节点

    一直忘记更新了,把剑指offer更新完吧.... 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3-&g ...

  6. python实现剑指offer删除链表中重复的节点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  7. 第18题:在O(1)时间删除链表结点+删除链表中重复的节点

    题目描述:题目描述在O(1)时间删除链表结点 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 考查创新编程能力. 思路: 1.如果从头到尾遍历,时间O(n) 2.如果将待删 ...

  8. 剑指offer系列30-----删除链表中重复的节点

    [题目]在一个排序的链表中,存在重复的结点, * 请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. * 例如,链表1->2->3->3->4->4->5 ...

  9. AcWing 29. 删除链表中重复的节点

    题目地址 https://www.acwing.com/problem/content/description/27/ 来源:剑指Offer 题目描述在一个排序的链表中,存在重复的结点,请删除该链表中 ...

随机推荐

  1. 【Java例题】1.3给朋友的贺卡

    3.对“Hello World”程序进行改造, 能够显示一张发给朋友的贺卡.格式如下: ****************************** 张三,你好! 祝你学习愉快! 你的好朋友:李四 2 ...

  2. IPC机制1

    1.Android IPC简介 Inter-Process Communication的缩写就是IPC,含义是进程间通信或是跨进程间通信,是指两个进程进行交换数据的过程. 进程是什么? 进程在pc上就 ...

  3. android ——Tablayout

    Tabs make it easy to explore and switch between different views. 通过TabLayout可以在一个活动中通过滑动或者点击切换到不同的页面 ...

  4. js拖拽上传图片

    有时候,在开发中,需要遇到拖拽上传图片的需求,即从磁盘选中一张或多张图片,然后按着鼠标把图片拖动到页面上指定的区域,实现图片的上传. 1.后端上传图片的接口 我是之前用vue写一个简单的后台系统的时候 ...

  5. Android OTG之USB转串口模块通讯

    微信公众号:CodingAndroid CSDN:http://blog.csdn.net/xinpengfei521 1.背景简介 我们公司开发了一款室内机平板APP应用,要求平板能去控制智能门锁. ...

  6. 欢迎加入我的知识星球:C语言解惑课堂

    我在知识星球上开通了一个有关C语言基础答疑解惑的星球,它叫做:“C语言解惑课堂”.看这名字你就知道虽然有点俗,俗才贴近你的真正需求嘛!这是一个专门帮助C语言初学者答疑解惑的课堂.嗯~~~,关于这个星球 ...

  7. Docker系列之.NET Core入门(三)

    前言 在Docker生态系统中除了上一节所讲解的基本概念,还有其他专业术语,本文我们将一笔带过,同时会开始陆续进入到在.NET Core中使用Docker. 专业术语 Docker Engine(Do ...

  8. Windows Server 2008配置系统安全策略

    下面学习Windows Server 2008配置系统安全策略 在工作组中的计算机本地安全策略有 用户策略,密码策略,密码过期默认42天 服务账户设置成永不过期,帐户锁定策略,本地策略,审核策略,计算 ...

  9. 思科ACS5.8最新搭建教程-亲测可用

    1.需要准备的相关软件 ACS5.8安装包:http://ouo.io/MWB0R ACS5.8破解包:http://ouo.io/FaiGgj Centos7:下载地址(破解时需要):http:// ...

  10. AntV F2+vue-cli构建移动端可视化视图

    AntV F2是蚂蚁金服旗下的一个专注于移动,开箱即用的可视化解决方案,完美支持 H5 环境同时兼容多种环境(Node, 小程序,Weex), 完备的图形语法理论,满足你的各种可视化需求,专业的移动设 ...