[蓝蓝计算机考研算法二期]-day16

108 阅读2分钟

22、给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。

1.此题对比原题有改动

2.题目保证链表中节点的值互不相同

3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点

数据范围:

0<=链表节点值<=10000

0<=链表长度<=10000

示例1

输入:

{2,5,1,9},5

返回值:

{2,1,9}

复制

说明:

给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9   

示例2

输入:

{2,5,1,9},1

返回值:

{2,5,9}

说明:

给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 2 -> 5 -> 9   

思路

将所输入的值组成链表,然后一次遍历链表将所需要删除的内容删除即可。

具体实现

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

#define MAX_LEN 10000

// 链表结构体
struct ListNode {
    int val;
    struct ListNode* next;
};

// 删除链表中指定值的节点,返回链表头指针
struct ListNode* deleteNode(struct ListNode* head, int val) {
    // 处理头结点为待删除结点的情况
    if (head != NULL && head->val == val) {
        struct ListNode* temp = head;
        head = head->next;
        free(temp);
        return head;
    }
    // 处理其他结点为待删除结点的情况
    struct ListNode* prev = head;
    struct ListNode* curr = head->next;
    while (curr != NULL && curr->val != val) {
        prev = curr;
        curr = curr->next;
    }
    if (curr != NULL) {
        prev->next = curr->next;
        free(curr);
    }
    return head;
}


// 创建链表的函数
struct ListNode* createList() {
    char str[MAX_LEN];
    int num[MAX_LEN];
    int n,i,j=0;
    
    // 将输入的内容按照字符串读入 
	scanf("%s", str);
	// 读取字符串中不含‘{’‘}’的内容 
	for (i = 0; str[i] != '}'; i++) {
        if (str[i] != '{') {
            str[j++] = str[i];
        }
    }
    
    // 读取要删除的数字 
    n = int(str[j+3]-'0');
    str[j] = '\0';  // 确保新字符串以 '\0' 结尾
    
	// 分割字符串并转换为数字
	i=0;
    char *token = strtok(str, ",");
    while (token != NULL) {
        num[i++] = atoi(token);
        token = strtok(NULL, ",");
    }
    
    struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
	head->val = num[0];
    head->next = NULL;
	struct ListNode* p = head;
	for (j = 1; j < i; j++) {
		struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
        node->val = num[j];
        node->next = NULL;
        p->next = node;
        p = p->next;
    }
    
    // 删除节点 
    deleteNode(head, n);
    
	return head;
}

// 打印链表的函数
void printList(struct ListNode* head) {
    struct ListNode* current = head;
    printf("{"); 
    while (current != NULL) {
        printf("%d", current->val);
        current = current->next;
        if(current != NULL)
        	printf(",");
    }
    printf("}");
    printf("\n");
}

int main() {
	struct ListNode* list = createList();
	
	printList(list);
	
	return 0;
}

image.png

小结

本次算法不算困难,但是其中的输入以及输出的格式需要小心和注意。