学渣带你刷Leetcode0019删除链表的倒数第N个节点

题目描述

给定一个链表,删除链表的倒数第 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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章