(链表,插入元素)破损的键盘

217 篇文章 13 订阅
该博客讲述了如何处理一个破损的键盘问题,其中Home键和End键会自动按下,导致输入的文本顺序混乱。博主通过分析和解答,提出了利用数组表示单链表的方法来解决这个问题,包括链表的插入操作和遍历策略,并提供了样例输入和输出。
摘要由CSDN通过智能技术生成

题目:

你有一个破损的键盘。键盘上的所有键都可以正常工作,但有时Home键或者End键会自 动按下。你并不知道键盘存在这一问题,而是专心地打稿子,甚至连显示器都没打开。当你 打开显示器之后,展现在你面前的是一段悲剧的文本。你的任务是在打开显示器之前计算出 这段悲剧文本。
输入包含多组数据。每组数据占一行,包含不超过100000个字母、下划线、字符“[”或
者“]”。其中字符“[”表示Home键,“]”表示End键。输入结束标志为文件结束符(EOF)。输
入文件不超过5MB。对于每组数据,输出一行,即屏幕上的悲剧文本。
样例输入:
This_is_a_[Beiju]_text
[[]][][]Happy_Birthday_to_Tsinghua_University
样例输出:
BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University

分析与解答:

这题怎么说呢,刘汝佳一上来就把链表的核心抛出来了,我足足看了两个小时才理解,不过利用数组表示单链表也掌握了
0.为了方便起见,常常在链表第一个元素之前放一个虚拟节点s[0]
1.光标cur,最后一个字符编号last,其实只是由于这题home,end的条件限制
如果用数组建立单链表,只需要next[i]和s[i]
2.其中next[i]是s[i]连的下一个字符的编号,比如:
s[0],next[0]=3连下一个字符->
s[next[0]],next[next[0]]
3.在本题中,如果ne

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
链表是一种常见的数据结构,它由一些节点组成,每个节点包含一个数据项和指向下一个节点的指针。链表中的数据项可以是任何类型的数据,例如整数、字符串等。链表插入元素和删除元素链表操作中常见的两种操作。 链表插入元素 链表插入元素操作可以分为两种情况: 1. 在链表插入元素链表插入元素是最简单的一种情况,因为只需要将新元素插入链表头部即可。具体步骤如下: (1)创建一个新节点,将需要插入元素赋值给新节点的数据项。 (2)将新节点的指针指向原链表的头节点。 (3)将新节点设置为链表的新头节点。 示例代码: ``` struct Node { int data; struct Node* next; }; void insertAtBeginning(struct Node** head_ref, int new_data) { /* 1. create new node */ struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); /* 2. put in the data */ new_node->data = new_data; /* 3. Make next of new node as head */ new_node->next = (*head_ref); /* 4. move the head to point to the new node */ (*head_ref) = new_node; } ``` 2. 在链表中间或尾部插入元素链表中间或尾部插入元素需要先找到要插入的位置,然后将新元素插入到该位置之后。具体步骤如下: (1)创建一个新节点,将需要插入元素赋值给新节点的数据项。 (2)遍历链表,找到要插入的位置。 (3)将新节点的指针指向该位置的下一个节点。 (4)将该位置的节点的指针指向新节点。 示例代码: ``` void insertAfter(struct Node* prev_node, int new_data) { /*1. check if the given prev_node is NULL */ if (prev_node == NULL) { printf("the given previous node cannot be NULL"); return; } /* 2. create new node */ struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); /* 3. put in the data */ new_node->data = new_data; /* 4. Make next of new node as next of prev_node */ new_node->next = prev_node->next; /* 5. move the next of prev_node as new_node */ prev_node->next = new_node; } ``` 链表删除元素 链表删除元素操作也可以分为两种情况: 1. 删除链表元素 删除链表元素需要将链表的头指针指向下一个节点即可。具体步骤如下: (1)如果链表为空,则返回。 (2)将头节点指针指向下一个节点。 (3)释放原头节点的内存空间。 示例代码: ``` void deleteAtBeginning(struct Node** head_ref) { /* 1. check if the list is empty */ if (*head_ref == NULL) return; /* 2. Store head node */ struct Node* temp = *head_ref; /* 3. Change head to next node */ *head_ref = (*head_ref)->next; /* 4. free the old head node */ free(temp); } ``` 2. 删除链表中间或尾部元素 删除链表中间或尾部元素需要先找到要删除的节点,然后将该节点的前一个节点的指针指向该节点的下一个节点即可。具体步骤如下: (1)如果链表为空,则返回。 (2)遍历链表,找到要删除的节点。 (3)将该节点的前一个节点的指针指向该节点的下一个节点。 (4)释放该节点的内存空间。 示例代码: ``` void deleteNode(struct Node** head_ref, int key) { /* 1. check if the list is empty */ if (*head_ref == NULL) return; /* 2. store head node */ struct Node* temp = *head_ref, *prev; /* 3. if head node itself holds the key to be deleted */ if (temp != NULL && temp->data == key) { *head_ref = temp->next; /* change head */ free(temp); /* free old head */ return; } /* 4. search for the key to be deleted, keep track of the previous node as we need to change 'prev->next' */ while (temp != NULL && temp->data != key) { prev = temp; temp = temp->next; } /* 5. if key was not present in linked list */ if (temp == NULL) return; /* 6. unlink the node from linked list */ prev->next = temp->next; /* 7. free memory */ free(temp); } ``` 以上就是链表插入元素和删除元素的详细介绍和示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天学点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值