面试的时候遇到了一个笔试题,是leetcode的原题,原题的连接:

https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

大概的内容:删除链表的倒数第N个节点,并返回链表的头节点。

一开始遇到这个题也是一脸懵,通过查看解题思路才了解到有几种解决方式:

单向项链表实现类:

public class ListNode {

int val;

ListNode next;

ListNode(int x) { val = x; }

}

0x01:两次循环求长度

实现思路:

1、先循环一遍链表,求出链表的长度L,倒数第N个节点就是从开头数第(L-N+1)个节点,将此节点的next指向下下节点就可以了。

在解题的过程中要添加一个亚节点(dummy)进行辅助(如:图1),D就是我们的亚节点。

图1

代码:

ListNode dummy = new ListNode(0);//亚节点

dummy.next = head;

int length = 0;

ListNode first = head;

//通过移动头节点循环求出链表的长度

while(first != null){

length++;

first=first.next;

}

length -= n;//计算要删除节点位置

first = dummy;

while(length > 0){

length --;

first = first.next;

}

first.next = first.next.next;

return dummy.next;//返回头节点

0x02:双指针

实现思路:

1、定义两个指针同时指向我们的亚节点。

2、第一个指针节点向前移动N+1步,第二个指针保持不动,这时两个指针相隔N个节点的距离

3、同时移动两个指针保持恒定的距离,直到第一个指针到达最后一个节点。

4、这时第二个指针所指向的节点的下一个节点就是要删除的节点(倒数第N个节点),将第二个指针指向的节点的next指向下下个节点就完成了。

图2

代码:

ListNode dummy = new ListNode(0);//亚节点

dummy.next = head;

ListNode first = dummy;//第一个指针

ListNode secound = dummy;//第二个指针

for(int i = 0; i

first= first.next;

}

while(first != null){//同时移动第一个指针和第二个指针直到第一个指针指向null

first = first.next;

secound = secound.next;

}

secound.next = secound.next.next;

return dummy.next;

我们能看到方法二比方法一代码简洁一些,双指针也是算法题里面比较常用的解题方法。

仔细查看评论区我们又看到不错的解题思路,使用递归方法和特性实现

0x03:递归的特性

实现思路:

1、利用递归调用的特性先循环一遍链表,相当于用指针从链表头走到链表尾(如:图3-2)

2、递归调用在调用自身方法后面会倒叙的循环调用,相当于指针在从尾节点执行到头节点,这时在第N步将指针指向的节点的next指向下下个节点就完成了。

这里递归的特性和使用会在后面单独写一篇文章来说明。

图3-1

图3-2

代码:

public static ListNode removeNthFromEnd(ListNode head, int n){

int pos = helper(head, n);

// 说明删除的是头节点

if(pos == n - 1) {

return head.next;

}

return head;

}

// 获取节点所在位置,逆序

public int helper(ListNode node, int n){

if(node.next == null) {

return 0;

}

int pos = helper(node.next, n) + 1;

if(pos == n) {

node.next = node.next.next;

}

return pos;

}

source:https://www.cnblogs.com/stevewys/articles/13252439.html

喜欢,在看

java 链表删除头结点,删除链表的倒数第N个节点,并返回链表的头节点相关推荐

  1. 数据结构Java实现03----单向链表的插入和删除b

    文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构: (物理存储结构上不连续,逻辑上连续:大小不固定)            概念: 链式存储结构是基于指针实现的.我们把一个数据 ...

  2. java语言实现单链表---不含头结点

    java语言实现单链表---不含头结点 一.相关概念 1.什么是线性表 2.什么是顺序表 3.什么是链表 4.单链表.双链表.循环单链表.循环双链表 5.头结点和首结点 6.常见的栈和队列与线性表的关 ...

  3. 线性表的链式存储结构以及单链表的插入和删除原理实现

    线性表的链式存储结构 线性表中的每个元素最多只有一个前驱元素和一个后继元素(其逻辑结构),因此可以采用链式存储结构存储. 链表 线性表的链式存储结构称为链表.在链表中每个结点不仅包含有元素本身的信息( ...

  4. C语言实现了一个具有头结点的单链表(附完整源码)

    实现了一个具有头结点的单链表 有头结点的单链表 实现了一个具有头结点的单链表完整源码 有头结点的单链表 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中的任 ...

  5. 【数据结构与算法】 01 链表 (单链表、双向链表、循环链表、块状链表、头结点、链表反转与排序、约瑟夫环问题)

    一.线性表 1.1 概念与特点 1.2 线性表的存储结构 1.3 常见操作 1.4 应用场景 二.链表 2.1 链表简介 2.2 单向链表(单链表) 2.21 基本概念 2.22 单链表基本操作 2. ...

  6. python 链表中头结点的含义以及引入头结点的作用

    一.概念 头结点:是虚拟出来的一个结点,不保存数据.头结点的next指针指向链表中的第一个节点.对于头结点,数据域可以不存储任何信息,也可存储如链表长度等附加信息.头结点不是链表所必需的. 头指针:是 ...

  7. 单链表:带头结点和不带头结点 总结

    写在前面: 一直以来,带头结点和不带头节点的单链表的操作实现困扰着我.在没有理解和实现之前,光凭思考真的是很难理解清楚 1.两者之间代码的差异: 2.带不带头结点的区别: 3.带头结点之后,什么情况下 ...

  8. 插入始终是1_C++入门篇(四十四),链表查询与结点插入

    链表的查询 对链表进行各种操作时,需要先对某一个结点进行查询定位.假设数据中没有数据相同的结点,我们可以编写这样一个函数,查找到链表中符合条件的结点,我们在四十三篇的代码中声明搜索结点函数原型: 在底 ...

  9. 数据结构与算法(十三)删除二叉树结点

    删除二叉树结点 删除结点是二叉树操作中最复杂的.在删除之前首先要查找要删除的结点.找到结点后,这个要删除的结点可能会有三种情况需要考虑. 1. 该节点是叶子结点,没有子结点 要删除叶子结点,只需要改变 ...

最新文章

  1. 人工智能:深层神经网络
  2. 《一起学习rgbdSLAM》中g2o部分报错的问题
  3. 深蓝学院的深度学习理论与实践课程:第五章
  4. 【 Verilog HDL 】正确的变量访问思路
  5. 洛谷 P1663 山
  6. 利用TensorFlow2.0为胆固醇、血脂、血压数据构建时序深度学习模型(python完整源代码)
  7. c语言形考作业1答案,c语言程序设计形考任务二答案.doc
  8. hihocoder-Week173--A Game
  9. linux inputuevent使用
  10. Sass基础知识及语法
  11. Oracle GoldenGate For Big Data - Kafka Handler
  12. nginx 平滑升级
  13. vant:修改van-nav-bar__title颜色——vant中nav-bar组件标题颜色
  14. php网站整合ck播放器,wordpress主题整合ckplayer播放器
  15. Windows 技术篇-资源管理器文件默认排序设置,通用文件夹排序设置
  16. day42.自动关机小程序
  17. 银河麒麟(kylin)V10桌面版
  18. 三、Echart图表 之 X轴(xAxis)与 Y轴(yAxis)配置项大全
  19. 跨境电商淘宝详情解决方案
  20. postgresql-COALESCE函数、NULLIF函数、NVL函数使用

热门文章

  1. 【Java语法】比较两个字符串是否相等
  2. MyBatis3 用log4j在控制台输出 SQL----亲测,真实可用
  3. 干货:MySQL 索引原理及慢查询优化
  4. Spring开启@Async异步方法(javaconfig配置)
  5. Effective Java之用接口模拟可伸缩的枚举(三十四)
  6. 【双百解法】2058. 找出临界点之间的最小和最大距离——Leecode周赛系列
  7. 【最佳解法】剑指 Offer 25. 合并两个排序的链表
  8. 给我往死里贪——HRBUST - 1167-每种面值的货币要多少
  9. 编译原理陈意云3-20 (a) 证明下面文法 S→AaAb|BbBa A→ε B→ε 是LL(1)文法,但不是SLR(1)文法。
  10. Web服务-Nginx网页服务