删除链表倒数第 n 个结点
题目描述
- 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
- 来源:力扣(LeetCode)
- 链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
- 说明:给定的n保证是有效的。
题解
- 思路:使用两个指针,第一个指针遍历n次,第二个指针指向链表头结点,此时,两个指针同时向后遍历,第一个指针到达终点时第二个指针指向的就是倒数第n个结点的位置。
- 解释:因为倒数加其对应的正数的和就是链表的总长度加一。所以,一个指针先遍历倒数的值,再向后遍历的链表尾节点的过程就是正数值,此时另一个指针从头结点遍历,该指针的终点就是倒数第n个结点。
代码
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//构造结构体
typedef struct list
{
int data;
struct list *next;
}*List,LNode;
//函数声明
List init_list(List head,int num);
void print_list(List head);
List delNode(List head,int num);
void main()
{
List head;
head = (List)malloc(sizeof(LNode));
head = init_list(head,5);
print_list(head);
head = delNode(head,5);
print_list(head);
}
//删除链表倒数第n个结点
List delNode(List head,int n)
{
List p,q;
p = head;
q = head;
if(head->next == NULL)
return NULL;
while(p->next != NULL)
{
if(n > 0)
{
p = p->next;
n--;
}
else
{
p = p->next;
q = q->next;
}
}
if(n == 1)
return head->next;
q->next = q->next->next;
return head;
}
//链表初始化函数
List init_list(List head,int num)
{
int i = 1;
List p = head;
while(i <= num)
{
List s;
s = (LNode*)malloc(sizeof(LNode));
s->data = rand() % 100 + 1;
s->next = NULL;
p->next = s;
p = p->next;
i++;
}
return head->next;
}
//链表输出函数
void print_list(List head)
{
List p;
p = head;
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("n");
}
0现在很多的同学都是大一刚刚接触编程,基础的c/c++的知识点问题还是比较多的,我也是专门给大家准备了一些资料帮助大家理解学习,有需要的同学可以私聊我,大家一起进步学习,加油相信自己是最棒的。
这些是C/C++能做的
服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等
“我是一名从事了10年开发的老程序员,最近我花了一些时间整理关于C语言、C++,自己有做的材料的整合,一个完整的学习C语言、C++的路线,学习材料和工具。全球最大的C/C++、编程爱好者的聚集地就在我这里!欢迎初学和进阶中的小伙伴。希望你也能凭自己的努力,成为下一个优秀的程序员。工作需要、感兴趣、为了入行、转行需要学习C/C++的伙伴可以跟我一起学习!”关注我,带你遨游代码世界!点击领取资料:领取
发布于 16:34