题目
定义一种单向链表的构造方法如下所示:
- 先输入一个整数 n ,代表链表中节点的总数;
- 再输入一个整数 h ,代表头节点的值;
- 此后输入 n−1 个二元组 (a,b) ,表示在值为 b 的节点后插入值为 a 的节点。
除此之外,保证输入的链表中不存在重复的节点值。
现在,对于给定的链表构造方法和一个额外的整数 k ,你需要先按照上述构造方法构造出链表,随后删除值为 k 的节点,输出剩余的链表。
示例
输入:
5 2 3 2 4 3 5 2 1 4 3输出:
2 5 4 1说明:
在这个样例中,链表的构造过程如下: 头节点为 2,得到链表 [2] ; 在 2 后插入 3 ,得到链表 [2,3] ; 在 3 后插入 4 ,得到链表 [2,3,4][2,3,4] ; 在 2 后插入 5 ,得到链表 [2,5,3,4] ; 在 4 后插入 1 ,得到链表 [2,5,3,4,1] ; 随后,删除值为 3 的节点,得到链表 [2,5,4,1] 。数据范围:链表长度满足 1≤n≤1000 ,节点中的值满足 0≤val≤10000
分析
时间复杂度:O(),
是节点个数
空间复杂度:O()
#include <iostream>
// 定义链表节点结构体
struct ListNode {
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
};
// 构造链表
ListNode* constructList(int n) {
int h;
std::cin >> h;
ListNode* head = new ListNode(h);
for (int i = 1; i < n; ++i) {
int a, b;
std::cin >> a >> b;
ListNode* nnode = new ListNode(a);
ListNode* ptr = head;
while (ptr && ptr->val != b) {
ptr = ptr->next;
}
if (ptr) {
nnode->next = ptr->next;
ptr->next = nnode;
}
}
return head;
}
// 删除值为 k 的节点
ListNode* deleteNode(ListNode* head, int k) {
if (!head) return nullptr;
// 如果头节点就是要删除的节点
if (head->val == k) {
ListNode* temp = head;
head = head->next;
delete temp;
return head;
}
ListNode* ptr = head;
while (ptr->next && ptr->next->val != k) {
ptr = ptr->next;
}
if (ptr->next) {
ListNode* temp = ptr->next;
ptr->next = temp->next;
delete temp;
}
return head;
}
// 打印链表
void printList(ListNode* head) {
ListNode* ptr = head;
while (ptr) {
std::cout << ptr->val;
if (ptr->next) {
std::cout << " ";
}
ptr = ptr->next;
}
std::cout << std::endl;
}
// 释放链表内存
void freeList(ListNode* head) {
while (head) {
ListNode* temp = head;
head = head->next;
delete temp;
}
}
int main() {
int n, k;
std::cin >> n;
ListNode* head = constructList(n);
std::cin >> k;
head = deleteNode(head, k);
printList(head);
freeList(head);
return 0;
}