學渣帶你刷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;
}

 

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