#include <stdio.h>
#include <stdlib.h>
struct ListNode{
int val;
struct ListNode *next;
};typedef struct ListNode ListNode;
struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
ListNode* Pres=head;
//控制走到末尾
ListNode* temp=head;
ListNode* s=head->next;
int i=0;
if(n==0){return head;}
else
{
while(temp->next!=NULL)
{
temp=temp->next;
i++;
if(i>n)
{
s=s->next;
Pres=Pres->next;
}
}
if(head->next==NULL)
{
return NULL;
}
//s链表指向了被删除节点的前一个节点
if(i==n-1)
{
head=head->next;
printf("I come here \n");
return head;
}
Pres->next=s->next;
free(s);
//删除链表
return head;
}
}
struct ListNode* creHeadList(int a[],int size)
{
ListNode* head;
ListNode* s;
ListNode node;
head=NULL;
int i=0;
for(i;i<size;i++)
{
s=(ListNode *)malloc(sizeof(ListNode));
node.val=a[i];
s->val=node.val;
s->next=head;
head=s;
}
return head;
}
//头结点不含信息的尾插法链表
struct ListNode* creTailList(int a[],int size)
{
ListNode* head;
ListNode* tail;
ListNode node;
head=NULL;
ListNode* s;
int i=0;
for(i;i<size;i++)
{
s=(ListNode *)malloc(sizeof(ListNode));
if(head==NULL)//首节点
{
node.val=a[i];
s->val=node.val;
head=s;
tail=s;
}else
{
node.val=a[i];
s->val=node.val;
tail->next=s;
tail=s;
}
}
tail->next=NULL;
return head;
}
//头节点含信息的链表
struct ListNode* creTailListMessage(int a[],int size)
{
ListNode* head;
ListNode* tail;
ListNode node;
ListNode* s;
head=(ListNode*)malloc(sizeof(ListNode));
head->next=NULL;
head->val=0;
tail=head;
int i=0;
for(i;i<size;i++)
{
s=(ListNode*)malloc(sizeof(ListNode));
node.val=a[i];
printf("a[%d] is %d \n",i,a[i]);
s->val=node.val;
s->next=NULL;
tail->next=s;
tail=s;
}
tail->next=NULL;
return head;
}
void priList(ListNode* head)
{
int i=0;
while(head!=NULL)
{
printf("node[%d] is %d \n",i,head->val);
head=head->next;
i++;
}
}
int main()
{
int size=2;
int a[2]={3,1};
void priList(ListNode* head);
struct ListNode* creHeadList(int a[],int size);
struct ListNode* removeNthFromEnd(struct ListNode* head, int n);
ListNode* head=creHeadList(a,size);
priList(head);
ListNode* result=removeNthFromEnd(head,2);
priList(result);
printf("GAME END\n");
return 0;
}
1、单次循环主要是通过维持三个指针
一、temp 循环链表至表尾 s 指针指向被删除节点 pres 指向被删除节点的前一个节点 n 通过控制 一次循环,跟随指针,定位被删除的节点
二、i=n-1;意味着删除的是头结点、