删除链表的倒数第N个节点(三种方法实现)
删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
方法一解题思路:要求删除倒数第N个节点,可以先设两个指针同时指向链表的第一个节点,一个指针遍历链表统计出总共有多少个节点记为i,用总数减去N,即可以算出要删除的节点为正数第几个节点记为index=i-N,让另一个指针移动到index节点的前一个节点(如果要删除的节点不是第一个节点)。最后执行删除操作,如果要删除的节点为第一个节点,则需要修改头指针,反之,则直接删除即可
/*解法一*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
int i = 1, j = i, index = 0;
struct ListNode *p, *ptr;
p = ptr = head;
/*寻找到尾节点*/
while (p->next != NULL)
{
p = p->next;
i++;
}
/*确定要删除的节点为正数第几个节点*/
index = i - n + 1;
/*将另一个指针移动到index节点的前一个位置*/
while (j + 1 < index)
{
ptr = ptr->next;
j++;
}
/*删除操作,判断要删除的节点是否为第一个节点*/
if (index != 1)
{
ptr->next = ptr->next->next;
return head;
}
else
{
return head = ptr->next;
}
}
方法二解题思路:设置两个指针同时指向第一个节点,让第一个指针p向前移动n次,之后第二个指针p和指针ptr开始一起移动,直到p为空或者p->next为空,此时指针ptr指向要删除节点的前一个节点(如果要删除的不是第一个节点)。如果要删除的节点为第一个节点,则需要修改头指针,反之则直接删除即可。
/*解法二*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode *p, *ptr = p = head;
int i;
/*让指针p向前走n步*/
while (n-- > 0)
{
p = p->next;
}
/*当指针p走完n步以后,让指针p和ptr同时向前走,直到p走到最后一个节点,即p->next=NULL,整个过程p和ptr之间相隔n-1个节点*/
while (p&&p->next != NULL)
{
ptr = ptr->next;
p = p->next;
}
/*此时的ptr指向要删除节点的前一个节点,需要考虑删除的节点是否为首元节点*/
if (p == NULL)
return head = head->next;
else
{
ptr->next = ptr->next->next;
return head;
}
}
方法三解题思路:方法三和方法四大同小异,首先当front非空时,让front移动n+1次,之后让behind跟着front一起移动(front和behind之间相隔n-1个节点),直到front为空。移动结束以后实行删除操作,删除操作和方法一和方法二一样。
struct ListNode * removeNthFromEnd(struct ListNode * head,int n){
struct ListNode* front = head;
struct ListNode* behind = head;
while (front != NULL) {
front = front->next; /*指针front往前移动n+1次*/
if (n-- < 0) behind = behind->next; /*如果指针behind==0,表明需要删除的节点为第一个节点*/
}
/*循环过后,两个指针之间相隔n-1个节点*/
if (n == 0) head = head->next;
else behind->next = behind->next->next;
return head;
以上就是解题心得,如果有错误或有疑问欢迎大家指出,大家共同进步。
删除链表的倒数第N个节点(三种方法实现)的更多相关文章
- lintcode:Remove Nth Node From End of Lis 删除链表中倒数第n个节点
题目: 删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 样例 给出链表1->2->3->4->5->null和 n = 2. 删除 ...
- 删除链表中倒数第n个节点
给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 样例 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1 ...
- [LeetCode] 19. 删除链表的倒数第N个节点
题目链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ 题目描述: 给定一个链表,删除链表的倒数第 n 个节点, ...
- [Swift]LeetCode19. 删除链表的倒数第N个节点 | Remove Nth Node From End of List
Given a linked list, remove the n-th node from the end of list and return its head. Example: Given l ...
- 22、删除链表的倒数第N个节点
22.删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删 ...
- 删除链表的倒数第N个节点(java实现)
题目: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链 ...
- 0011 删除链表的倒数第N个节点
给 定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...
- 删除链表的倒数第N个节点
题目描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后 ...
- 【LeetCode题解】19_删除链表的倒数第N个节点(Remove-Nth-Node-From-End-of-List)
目录 描述 解法:双指针 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以访问我的 github. 描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回 ...
- LeetCode(19):删除链表的倒数第N个节点
Medium! 题目描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了 ...
随机推荐
- P5135 painting(组合数)
传送门 如果\(op==1\),那么每一个方案都可以看做从\(n\)个数里选出\(m\)个数,然后\(sort\)一下依次放到每列,方案数就是\({n\choose m}\).因为\(n\)很大,但是 ...
- Aandroid 解决apk打包过程中出现的“Certificate for <jcenter.bintray.com> doesn't match any of the subject alternative names: [*.aktana.com, aktana.com]”的问题
有时候,apk打包过程中会出现“Certificate for <jcenter.bintray.com> doesn't match any of the subject alterna ...
- Java语言和虚拟机规范下载
- java简单操作redis数据库
package RedisTest; import redis.clients.jedis.Jedis; public class RedisTest { private static String ...
- mysql自己编写启停脚本
一.场景 在实际生产环境中要求相对较高的企业对于root权限管控相对比较高,故而很多软件并非安装在root用户下(当然root用户权限也可管理,但正常情况下root权限并不会给业务使用方,而会给一个普 ...
- centos6.3下postgresql-9.3安装记录
Xshell for Xmanager Enterprise 4 (Build 0186) Copyright (c) 2002-2011 NetSarang Computer, Inc. All r ...
- vue+webpack+VS Code入门简单的项目配置
为了方便,这边的编译器选择的是VS Code (Visual Studio Code); 打开VS Code,选择好自己的工作空间,然后新建一个文件夹作为我们项目的文件夹,然后,show time: ...
- MAC无法确认开发者身份
网上下载的软件,如果来自身份不明的开发者,在MAC上打开时会提示无法确认开发者的身份,在网上找到了一篇尝试解决的文章,文章链接地址为http://jingyan.baidu.com/article/f ...
- iOS Block的本质(二)
iOS Block的本质(二) 1. 介绍引入block本质 通过上一篇文章Block的本质(一)已经基本对block的底层结构有了基本的认识,block的底层就是__main_block_impl_ ...
- Git和SVN的5个基本区别
如果你在读这篇文章,说明你跟大多数开发者一样对GIT感兴趣,如果你还没有机会来试一试GIT,我想现在你就要了解它了. GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果 ...