題目描述
給定一個鏈表,刪除鏈表的倒數第 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;
}