题目一

题目

O(1)时间复杂度删除给定链表节点。

题解

用待删除节点后一个节点的值覆盖待删除节点值,更新链接关系。

注意链表只有一个节点;删除尾结点;删除头节点的处理。

代码

class ListNode {
int val;
ListNode next = null; ListNode(int val) {
this.val = val;
}
} public class Main {
public static void main(String[] args) {
//test case
ListNode n1=new ListNode(1);
ListNode n2=new ListNode(1);
ListNode n3=new ListNode(2);
ListNode n4=new ListNode(3);
//n1.next=n2;
n2.next=n3;
n3.next=n4; ListNode pHead=deleteNode(n1,n1); ListNode p=pHead;
while(p!=null){
System.out.println(p.val);
p=p.next;
}
} public static ListNode deleteNode(ListNode pHead,ListNode node) {
if(pHead==null||(pHead.next==null&&node==pHead)) {//一个节点单独判断,方便后面
return null;
} if(node.next==null) {//删除尾结点,仍要遍历整个链表
ListNode pNode=pHead;
while(pNode.next!=node) {
pNode=pNode.next;
}
pNode.next=null;
}
else {//删除其他节点
if(node==pHead) {//删除头结点,更新pHead
pHead=node.next;
}
node.val=node.next.val;
node.next=node.next.next;
}
return pHead;
}
}

题目二(再练习)

题目

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

题解

  • 增加一个头结点,三个指针pL,pR,p,分别代表:pL.next()是答案的头结点,pR是尾结点,p是待处理节点。
  • 在待判断节点剩两个及两个以上情况下:
    • 判断p和p.next()节点值是否相同,相同找到所有连续节点,删除;不同则直接连上。
  • 最后返回pL.next();

代码

class ListNode {
int val;
ListNode next = null; ListNode(int val) {
this.val = val;
}
} public class Main {
public static void main(String[] args) {
//test case
ListNode n1=new ListNode(1);
ListNode n2=new ListNode(1);
ListNode n3=new ListNode(2);
ListNode n4=new ListNode(3);
n1.next=n2;
n2.next=n3;
n3.next=n4;
ListNode pHead=deleteDuplication(n1); ListNode p=pHead;
while(p!=null){
System.out.println(p.val);
p=p.next;
}
} public static ListNode deleteDuplication(ListNode pHead) {
if(pHead==null||pHead.next==null) {
return pHead;
} ListNode pL=pHead.val==-1?new ListNode(-2):new ListNode(-1);//在原始链表前加一个不相同的头结点,最后返回头结点的下一个节点。
pL.next=pHead;
ListNode pR=pL;//新链表的尾结点
ListNode p=pHead;//待判断节点 while(p!=null&&p.next!=null) {
if(p.val==p.next.val) {//如果有连续相等的节点就全部去掉,此时尾结点不需要更新
int val=p.val;
while(p!=null&&p.val==val) {
p=p.next;
}
pR.next=p;//去掉连续相同节点
}else {//如果是只出现一次的节点连接上,更新链表的尾结点
pR=p;
p=p.next;
}
} return pL.next;
}
}

[剑指Offer]18-题目一:删除链表的节点 题目二:删除链表中重复节点的更多相关文章

  1. [剑指 Offer 18. 删除链表的节点]

    [剑指 Offer 18. 删除链表的节点] 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head ...

  2. 剑指 Offer 30. 包含min函数的栈 + 双栈实现求解栈中的最小值

    剑指 Offer 30. 包含min函数的栈 Offer_30 题目描述: 题解分析: 题目其实考察的是栈的知识,本题的目的是使用两个栈来求解最小值. 第二个栈主要用来维护第一个栈中的最小值,所以它里 ...

  3. 【Java】 剑指offer(18) 删除链表中重复的结点

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重 ...

  4. [剑指offer]09用两个栈实现队列插入和删除操作,C++实现

    原创博文,转载请注明出处! # 本文为牛客网<剑指offer>刷题笔记 1.题目 # 用两个栈实现队列的插入和删除操作 2.思路 栈服从先入后出的原则处理数据,队列服从先入先出的原则处理数 ...

  5. (剑指Offer)面试题17:合并两个排序的链表

    题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然时按照递增排序的. 链表结点定义如下: struct ListNode{ int val; ListNode* next; }; 思 ...

  6. 剑指offer——python【第16题】合并两个有序链表

    题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1-& ...

  7. 剑指Offer编程题(Java实现)——从尾到头打印链表

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路 思路一:使用头插法 使用头插法可以得到一个逆序的链表.遍历链表,每次将所遍历节点插入到链表的头部. 头结点和第一个 ...

  8. 剑指offer(18)二叉搜索树的后续遍历

    题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 以最后一个节点为根,从头往后找到第一个大于根 ...

  9. 剑指offer——python【第3题】从尾到头打印链表

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 理解 首先要理解链表的概念,链表是由一串串数字首尾相连组成的 解题 # -*- coding:utf-8 -*- # cla ...

  10. 《剑指offer》— JavaScript(16)合并两个排序的链表

    合并两个排序的链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. *** 思路 如果pHead1和pHead2中有一个为空,则result是另 ...

随机推荐

  1. day1 计算机的组成

    1.计算机,是用于高速计算的电子机器,具有数值计算, 逻辑判断,储存记忆的功能. 2.计算机由硬件系统和软件系统组成构成. 3.计算机中所有的运行程序都是在内存中进行的,暂时存放在CPU中的运算数据 ...

  2. 每日一道 LeetCode (19):合并两个有序数组

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  3. 2w字 + 40张图带你参透并发编程!

    并发历史 在计算机最早期的时候,没有操作系统,执行程序只需要一种方式,那就是从头到尾依次执行.任何资源都会为这个程序服务,在计算机使用某些资源时,其他资源就会空闲,就会存在 浪费资源 的情况. 这里说 ...

  4. 感谢 Vue.js 拯救我这个前端渣渣,让 PowerJob 有了管理后台界面

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri HelloGitHub 推出的<讲解开源项目>系列. 对于大部分非前端程序员来说,写网页无疑是一件非常痛 ...

  5. Mybatis入门(一)------基本概念操作

    Mybatis简介 Mybatis是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置 ...

  6. Tugnsten Fabric-MPLS-三层转发

    1.网络拓扑图如下: 2.场景:虚机1.1.1.3 ping 虚机3.3.3.3(两个虚机加入到虚拟路由器里面了,所以可以互通) 3.查看虚机1.1.1.3所对应的VRF: 4.其中41为mpls标签 ...

  7. 结对项目:四则运算题目生成器(C)

    一.Github项目地址:https://github.com/Spartaright/myapp(合作人:梁天龙.赖佑铭) 二.PSP表格(如下图) 1.项目地址 PSP表格 PSP2.1 Pers ...

  8. yield 的使用

    yield 在很多高级语言都有,比如:python.scala.JavaScript.Ruby等. 我们实际工作时,很少会用到yield,但是也架不住求职面试的时候,面试官可能会问呀. yield 在 ...

  9. Java--- 关于null的处理若干方法

    Java--- 关于null的处理若干方法 相信空指针是平时最常见的错误了,下面认识 null ,有助于解决 NPE 问题. nulll大小写敏感 关于这个问题,其实是对面试时候手写算法题时候需要注意 ...

  10. 对接接口时,组织参数json出现的问题

    在进行对接第三方接口时,进行参数组装成json的过程中出现参数传递格式错误以及json格式化错误. 在拼接json时,如果json中有对象,则以map的方式组装好所有参数.最后map转成json,不然 ...