欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
        
}