题目描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
白话题目:
给出一串链表,和一个要删除的倒数第几个的元素,把这个元素删除后再输出这个链表
算法:
(1)无头单链表尾插法的创建
(2)无头单链表的输出
(3)前后指针,先走n步,再一起走
(4)节点删除,释放空间
详细解释关注 B站 【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB
C语言完全代码
#include <stdio.h>
#include <stdlib.h>
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//链表的节点定义
typedef struct ListNode
{
int val;
struct ListNode *next;
} ListNode;
ListNode *ListCreate(int n)
{
ListNode *p=NULL,*head,*r;
head = NULL;
r=head;
int i=0;
while(i<n)
{
int x;
scanf("%d",&x);
p = (ListNode*)malloc(sizeof(ListNode));
p->val = x;
if(head==NULL)
{
head=p;
r=p;
p->next=NULL;
}
else
{
r->next=p;
r=p;
}
i++;
}
r->next=NULL;
return head;
}
void ListPrint(struct ListNode* head)
{
ListNode * p;
p=head;
while(p!=NULL)
{
printf("%d ",p->val);
p=p->next;
}
printf("\n");
}
struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
struct ListNode* a;//后指针
struct ListNode* b;//前指针
struct ListNode *temp;
a=head;//a指向头指针
b=head;
int i;
for( i=0; i<n; i++)
{
if(b->next)
b=b->next;//若b->next不为空则将指针向后推
else
return head->next; //防止就一个还删除
}
while(b->next)
{
a=a->next;
b=b->next;
}
temp=a->next;
a->next=a->next->next;
free(temp);
return head;
}
int main()
{
int numSize;
printf("输入n为链表节点个数\n");
scanf("%d",&numSize);
int n;
printf("输入要删除的是倒数第n个节点\n");
scanf("%d",&n);
//尾插无头单链表
ListNode *head=ListCreate(numSize);
head=removeNthFromEnd(head, n);
ListPrint(head);
return 0;
}