【链表】 LEETCODE19 删除倒数第n个节点
时间:2019-09-14
本文章向大家介绍【链表】 LEETCODE19 删除倒数第n个节点,主要包括【链表】 LEETCODE19 删除倒数第n个节点使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
//第一种解法,遍历一次数长度,然后把头尾相连,再遍历一次 class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* tem=head; int len=0; while(tem->next){ //这里得到的长度是真实长度-1 tem=tem->next; len++; } if(len==0) return NULL; if(len==1){ if(n==1){ head->next=NULL; } else head=head->next; return head; } tem->next=head; //头尾相连 ListNode* tail=tem; for( int i=0;i<len-n+1;i++){ //从最后一个节点出发,直到到达要删的节点的前一个;但如果要删的节点是表头,也不会移动 tem=tem->next; } ListNode* trash=tem->next; //要删的节点 tail->next=NULL; //如果要删的是最后一个,如果没有这句会把倒数第二个和头连成环 tem->next=trash->next; if(trash==head) head=head->next; tail->next=NULL; return head; } };
//上面一种分类非常麻烦,而且其实就是两个pass,完全没必要 //避免麻烦的分类和涉及头尾的特殊情况,很好用的方法是链表头加一个空的node class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* dummy= new ListNode(0); dummy->next=head; ListNode* r=head; int len=0; while(r){ r=r->next; len++; } r=dummy; for(int i=0; i<len-n; i++){ r=r->next; } r->next=r->next->next; return dummy->next; } };
//解法3, 用两个指针做遍历,第一个比第二个快n个节点,等第一个到达tail的时候,第二个就是要删的节点前一个。 class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* dummy=new ListNode(0); dummy->next=head; ListNode *f=dummy, *s=dummy; for(int i=0;i<n;i++){ f=f->next; } while(f->next){ f=f->next; s=s->next; } s->next=s->next->next; return dummy->next; } };
原文地址:https://www.cnblogs.com/rarecu/p/11520482.html
- 给已安装的Linux新增Swap交换分区
- ASM 翻译系列第二十一弹:ASM Attributes Directory
- Linux:sed命令详解
- ASM 翻译系列第二十二弹:ASM Internal ASM file number 8
- Ghost安装Win7/XP后自动恢复IP的批处理
- ASM 翻译系列第二十三弹:ASM Internal ASM files number 12 and 254
- Shell脚本的简单排错法及调试程序bashdb
- ASM 翻译系列第二十四弹:ASM Internal ASM files number 10 and 11
- Redhat设置NFS挂载的简单步骤
- WordPress后台首页显示RSS错误的解决办法
- ASM 翻译系列第十九弹:ASM Internal ASM Continuing Operations Directory
- ASM 翻译系列第二十五弹:ASM 高级知识 When will my rebalance complete
- ASM 翻译系列第二十六弹:ASM 高级知识 Where is my data
- LVS+Keepalived负载均衡主备&双主架构全攻略
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一条命令让你明白shell中read命令的常用参数
- 防抖与节流
- 一道题理解Linux中sort命令的多个参数
- Centos7服务器下启动jar包项目的最佳方法
- JavaScript易错点(长期更新)
- Centos7.5配置java环境安装tomcat的讲解
- CSS3卡片光照效果
- Linux文本查找命令find的用法详解
- Canvas系列(2):曲线图形
- Shell中去除字符串里的空格或指定字符的方法
- 使用‘fsck’修复Linux中文件系统错误的方法
- linux/OSX中“DD”命令制作ISO镜像操作系统安装U盘的方法
- 《高效能程序员的修炼》读书笔记
- linux之centos7防火墙基本使用详解
- Ubuntu安装scrcpy完成手机投屏和控制(Ubuntu用QQ微信的另一种方法)