【力扣 中等 C】19. 删除链表的倒数第 N 个结点

目录

题目

解法一:计算链表长度

解法二:双指针


题目

【力扣 中等 C】19. 删除链表的倒数第 N 个结点_第1张图片

解法一:计算链表长度

struct ListNode* delete(struct ListNode* head, int n)
{
    struct ListNode* virHead = malloc(sizeof(*virHead));
    virHead->next = head;

    int len = 0;
    struct ListNode* curNode = head;
    while (curNode)
    {
        len++;
        curNode = curNode->next;
    }

    curNode = virHead;
    for (int i = 0; i < len - n; i++)
        curNode = curNode->next;

    struct ListNode* freeNode = curNode->next;
    curNode->next = freeNode->next;
    free(freeNode);

    struct ListNode* retHead = virHead->next;
    free(virHead);
    return retHead;
}

struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
    return delete(head, n);
}

解法二:双指针

struct ListNode* delete(struct ListNode* head, int n)
{
    struct ListNode* virHead = malloc(sizeof(*virHead));
    virHead->next = head;

    struct ListNode* first = virHead;
    struct ListNode* second = virHead;

    int cnt = n;
    while (cnt--)
        second = second->next;

    while (second->next)
    {
        first = first->next;
        second = second->next;
    }

    struct ListNode* freeNode = first->next;
    first->next = freeNode->next;
    free(freeNode);

    struct ListNode* retHead = virHead->next;
    free(virHead);
    return retHead;
}

struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
    return delete(head, n);
}

你可能感兴趣的:(力扣,C,c语言,leetcode,数据结构,算法,开发语言)