题目一

题目

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. Lombok使用指南

    一.Lombok 简介 Lombok 是一款 Java 开发插件,使得 Java 开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的 Java 模型对象(POJO).在开发 ...

  2. SVN的基本使用

    2020年7月6日 为什么需要版本控制? 需要清晰地保存某些文件的不同修订版本 控制文件的发屐过程,找出导致 BUG 的原因 轻松将项目或文件恢复到指定版本 极大方便团队之间协同开发,防止出现混乱 在 ...

  3. 逃离CSDN -慕舲的黑夜-第三期

    来时,是朋友推荐查资料,后来看到CSDN的UI,好华丽高大上,也读了CSDN首页推荐的一些文章,加入CSDN. 可是后来随着博客园,蓝奏云,w3c菜鸟教程,等平台的出现,CSDN越来越令人心寒

  4. Privacy-Preserving Deep Learning via Additively Homomorphic Encryption

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Full version of a paper at the 8-th International Conference on Appli ...

  5. 区块链入门到实战(31)之Solidity – 第一个程序

    为简单起见,我们使用在线Solidity开发工具Remix IDE编译和运行Solidity程序. 第1步 – 在File explorers选项卡下,新建一个test1.sol文件,代码如下: 示例 ...

  6. java23种设计模式——八、组合模式

    目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模式 java23种设计模式-- ...

  7. nginx配置过程中出现的问题

    在安装nginx时我们先创建用户useradd -s /sbin/nologin -M nginx 不然会报nginx: [emerg] getpwnam("nginx") fai ...

  8. iOS NSOperation

    iOS NSOperation 一.简介 除了,NSThread和GCD实现多线程,配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOp ...

  9. P1073 最优贸易 分层图+最长路

    洛谷p1073 最优贸易 链接 首先易得暴n2的暴力,暴力枚举就行 显然1e5的数据是会炸的 我们再分析题意,发现一共分为两个个步骤,也可以说是状态,即在一个点买入,在另一个点卖出,我们可以构建一个三 ...

  10. [Failed]Tomcat cluster方案共享session配置出错,sigh....

    后继发展:https://www.cnblogs.com/xiandedanteng/p/12134300.html 参考网文一:多个Tomcat之间实现Session共享 参考网文二:Tomcat官 ...