删除链表的倒数第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. 当删除了 ...
随机推荐
- MyBatist庖丁解牛(二)
站在巨人的肩膀上 https://blog.csdn.net/xiaokang123456kao/article/details/76228684 一.概述 我们知道,Mybatis实现增删改查需要进 ...
- struts2学习笔记 day02 获取参数 访问ServletAPI 结果类型
- mysql ERROR 2003 (HY000): Can't connect to MySQL server on '' (10060
关闭防火墙即可连接成功: systemctl stop firewalld
- [Python]IndentationError: unindent does not match any outer indentation level
这个是缩进没对齐 可能是混用了tab与空格,到这里显示空白就可以看出来.
- UWP Popup 弹出提示框
一:需求 做一个类似于安卓的弹出消息框,如图.当用户点击下载或者选择时,能够从底部弹出一个提示框,用于提示用户. 二:Popup 类 不需要我们自己额外去写一个弹窗类,微软自己有一个Popup 弹窗类 ...
- 去除List<Object>集合中重复的元素(利用HashSet的特性---无重复元素)
import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator; public class Hashset ...
- JS脚本不能执行
这段时间在做前端的动态页面,出了很多问题,因为js平时用的很少,所以花了不少无用功. 其中有两点一定要注意: 1.当js中有语法错误时,js脚本会无法执行. 2.当js脚本中有未定义的变量时,后边的语 ...
- AJPFX关于子类父类中的构造
1.子父类中的构造函数不存在重写,因为子父类的构造函数名字不一样(重写要求子父类的方法名字一模一样,包括参数列表)2.子类创建对象时会先运行父类的构造函数再运行子类的构造函数.因为每个子类的构造函数的 ...
- kafka java api生产者
import java.util.HashMap; import java.util.List;import java.util.Map;import java.util.Properties; im ...
- uvm_marcos——UVM宏定义
I programmed all night.Through the window, on my screen,The rising sun shined. 编程一整夜,透过窗户,照在屏幕上.初升的太 ...