n个人选k个c语言_算法分享---删除链表倒数第 n 个结点(C语言)

32fe4030af318cf05627cb53fcdf5c6d.png

58777fcc2d7209d7f06f129eccc75c91.png

删除链表倒数第 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++的伙伴可以跟我一起学习!”关注我,带你遨游代码世界!点击领取资料:领取

f0c5df7ce21073bd88348ab4a9fe7bf3.png

发布于 16:34

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值