leecode链表章(一)—19. 删除链表的倒数第N个节点
程序员文章站
2024-03-06 09:57:49
...
我在刷19. 删除链表的倒数第N个节点的时候,发现很多问题,所以重新写一章关于链表的,供自己以后学习和参考。
首先说链表的作用,我的理解就是动态分配空间。
链表定义
struct nodelist
{
int val;
struct nodelist * next;
}
《C Primer Plus》一书写到虽然结构不能与本身类型相同的结构,但是可以含有指向同类型结构的指针。这也是 为什么链表能成功创建的原因。
next为下一个结点的地址,如果结点为1>2>3>4>5
struct nodelist* head;
head=(struct nodelist*)sizeof(struct nodelist);
head->val=1;
head->next=(struct nodelist*)sizeof(struct nodelist);
head->next->val=2;
head->next->next=(struct nodelist*)sizeof(struct nodelist);
head->next->next->val=3;
head->next->next->next=(struct nodelist*)sizeof(struct nodelist);
head->next->next->next->val=4;
head->next->next->next-->next=(struct nodelist*)sizeof(struct nodelist);
head->next->next-->next->next->val=5;
head->next->next->next-->next-->next=NULL;
如果利用循环该怎么做?
先定义一个current指针,代表当前指针。
prev代表上一个指针。
current = (struct nodelist*)sizeof(struct nodelist);
链表的第一个结构的地址应该储存在指针变量head中,随后的每个结构的地址储存在其前一个结构的next成员。把head指针初始化为NULL,随后用head的值进行判断。
if(head == NULL)
head =current;
else
prev->next=current;
其次把next成员设置成NULL;表明当前结构是链表的最后一个结构;
current->next =NULL;
prev = current;
原题
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
int num_sum=0;
int num_index=0;
int i;
struct ListNode* new_current=NULL;
struct ListNode* new_prev=NULL;
struct ListNode* new_head=NULL;
struct ListNode* old_p1=head;
while(old_p1!=NULL)
{
num_sum++;
old_p1=old_p1->next;
}
num_index=num_sum-n;
if(num_index==0)
{
new_head=head->next;
return new_head;
}
old_p1=head;
for(i=0;i<num_index;i++)
{
new_current=(struct ListNode*)malloc(sizeof(struct ListNode));
new_current->val=old_p1->val;
new_current->next=NULL;
if(new_head==NULL)
{
new_head=new_current;
}
else
{
new_prev->next=new_current;
}
new_prev=new_current;
printf("%d",new_prev->val);
old_p1=old_p1->next;
}
new_prev->next=old_p1->next;
return new_head;
}