首页 > 试题广场 >

删除链表的中间节点

[编程题]删除链表的中间节点
  • 热度指数:2227 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个链表,实现删除链表第 K 个节点的函数。

输入描述:
n 表示链表的长度。

m 表示删除链表第几个节点。

val 表示链表节点的值。


输出描述:
在给定的函数中返回链表的头指针。
示例1

输入

5 3
1 2 3 4 5

输出

1 2 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 *removeKthNode(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 = removeKthNode(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 *removeKthNode(Node *head, int k) {
    Node *cur = head, *pre = NULL, *old;
    for (int i = 1; i < k; i++) {
        pre = cur;
        cur = cur->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 23:05:27 回复(0)
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;

typedef struct ListNode {
  ElemType data;
  struct ListNode* next;
} ListNode, *PLNode, *L;

void print_list(L head) {
  while (head) {
    fprintf(stdout, "%d", head->data);
    if (head->next) fputc(32, stdout);
    head = head->next;
  }
}

int main(const int argc, const char* const argv[]) {
  int n, m;
  fscanf(stdin, "%d %d", &n, &m);
  
  L dummy = (PLNode) malloc (sizeof(ListNode));
  if (!dummy) exit(0);
  
  int x;
  PLNode tail = dummy;
  while (fscanf(stdin, "%d", &x) != EOF) {
    tail = tail->next = (PLNode) malloc(sizeof(ListNode));
    tail->data = x;
    tail->next = NULL;
  }
  
  PLNode pre, curr = dummy;
  while (m--) {
    pre = curr;
    curr = curr->next;
  }
  pre->next = curr->next; // delete node
  
  print_list(dummy->next);
  return 0;
}

发表于 2021-08-04 11:01:43 回复(0)

问题信息

上传者:小小
难度:
2条回答 3953浏览

热门推荐

通过挑战的用户

查看代码