给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

思路:链表不同于数组,也不同于字符串,不可能事先知道它的长度,除非遍历到最后结尾。删除倒数第N个节点,可以先遍历到链表尾部,再反向遍历N个,找到倒数第N个节点删除就好了。但是这种方式明显太复杂了,如果我要删除第一个节点的话,那就要遍历两轮了。

所以我们可以一次遍历就找到倒数第N个节点,就是采用双指针。两个指针差N-1个节点,当快的指针到达尾部的时候,慢的指针刚好指到倒数第N个,然后删除该节点就好了,我们这里注意,删除一个节点,要使它的前面的指针指向它后面的指针,所以我们还要维护一个慢的指针前面的指针,用来完成删除操作。

另外就是在编程中要注意对特殊情况的判断,比如就一个节点,删除变为空的情况,以及删除的是头结点的情况

 ListNode* removeNthFromEnd(ListNode* head, int n)
{
if(head==NULL) return head;
ListNode*p1,*p2,*p3;
p1=p2=p3=head;
int num=0;
if(num==n-1 && head->next==NULL)//只有一个节点
return NULL;
while(p2->next)
{
if(num==n-1)//当快慢指针差距n-1之后,要保持住
{
p3=p1;
p1=p1->next;
num--;
}
p2=p2->next;
num++;
}
p3->next=p1->next;
if(p1==head)//如果要删除的节点是头结点
{
head=p1->next;
}
delete p1;
return head;
}

最新文章

  1. 使用FileSystemWatcher监控文件夹及文件
  2. druid数据库密码加密程序编写
  3. 基于HTML5 Canvas实现工控2D叶轮旋转
  4. 【iCore3 双核心板_FPGA】实验十六:基于SPI总线的ARM与FPGA通信实验
  5. 技术文档--svn
  6. git 检出
  7. jQuery编写的一款兼容IE6的图片轮播幻灯片
  8. 关于NPC和NP-Hard问题
  9. Ignatius and the Princess III --undo
  10. 谷歌(Google Chrome)插件安装
  11. express+mysqle
  12. Python 制作Android开发 所需的适配不同分辨率的套图
  13. 树链剖分的一种妙用与一类树链修改单点查询问题的时间复杂度优化——2018ACM陕西邀请赛J题
  14. Tensorflow实战系列之三:
  15. MySQL使用LOAD DATA LOCAL INFILE报错
  16. Oracle的条件in包含NULL时的处理
  17. Vue+axios统一接口管理
  18. 【机器学习】SKlearn + XGBoost 预测 Titanic 乘客幸存
  19. Hankson 的趣味题
  20. InstallShield Build错误:Internal build error 6041

热门文章

  1. JVM(三)从JVM源码角度看类加载器层级关系和双亲委派
  2. 笔记 | 吴恩达新书《Machine Learning Yearning》
  3. Bitter.Core系列五:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 之 示例 分页聚联查询
  4. How to kill go routine?
  5. [Python]编码声明:是coding:utf-8还是coding=utf-8呢
  6. 【rz】【sz】参数详解
  7. LOJ10102旅游航道
  8. Java三种IO模型和LinuxIO五种IO模型
  9. Spring Boot 核心配置文件 bootstrap & application
  10. 项目管理/Bug管理/问题管理—Phabricator