首页 > 试题广场 >

在链表中删除倒数第K个节点

[编程题]在链表中删除倒数第K个节点
  • 热度指数:3913 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给出一个单链表,返回删除单链表的倒数第 K 个节点后的链表

输入描述:
第一行输入两个正整数 n, K ,分别表示链表的长度和要删除单链表倒数第K个节点。
接下来一行有 n 个整数,依次表示单链表中的各个节点的节点值val。


输出描述:
在给定的函数内返回删除倒数第K个节点后的链表的头指针。
示例1

输入

5 4
1 2 3 4 5

输出

1 3 4 5

备注:

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int val;
    struct node *next;
} Node;

Node *newNode(int val);

void freeList(Node *head);

Node *removeLastK(Node *head, int k);

int main(void) {
    int n, k, val;
    Node *node, *head = NULL, *cur = NULL;
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++) {
        scanf("%d", &val);
        node = newNode(val);
        if (head == NULL) {
            head = cur = node;
            continue;
        }
        cur->next = node;
        cur = cur->next;
    }
    head = removeLastK(head, k);
    cur = head;
    while (cur != NULL) {
        printf("%d", cur->val);
        cur = cur->next;
        if (cur != NULL)
            printf(" ");
    }
    printf("\n");
    freeList(head);
    return 0;
}

Node *newNode(int val) {
    Node *node = (Node *) malloc(sizeof(Node));
    node->val = val;
    node->next = NULL;
    return node;
}

void freeList(Node *head) {
    Node *old;
    while (head != NULL) {
        old = head;
        head = head->next;
        free(old);
    }
}

Node *removeLastK(Node *head, int k) {
    Node *fast = head;
    Node *slow = head;
    Node *pre = NULL, *old;
    for (int i = 0; i < k; i++) {
        fast = fast->next;
    }
    while (fast != NULL) {
        pre = slow;
        slow = slow->next;
        fast = fast->next;
    }
    if (pre == NULL) {
        old = head;
        head = head->next;
    } else {
        old = pre->next;
        pre->next = pre->next->next;
    }
    free(old);
    return head;
}

发表于 2022-02-06 22:49:01 回复(0)

问题信息

上传者:小小
难度:
1条回答 5287浏览

热门推荐

通过挑战的用户

查看代码