题目
题目链接
解题思路
- 首先需要构建一个单向链表,根据输入的数据进行节点插入
- 链表的构建过程:
- 第一个数表示节点总数
n
n
n
- 第二个数表示头节点的值
- 之后每两个数为一组,表示在值为
a
a
a 的节点后插入值为
b
b
b 的节点
- 构建完链表后,删除指定值的节点
- 最后按顺序输出链表中的所有节点值
代码
#include <iostream>
#include <map>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
int main() {
int n, head_val, val;
cin >> n >> head_val;
ListNode* head = new ListNode(head_val);
map<int, ListNode*> nodeMap;
nodeMap[head_val] = head;
for (int i = 0; i < n - 1; i++) {
int after_val, insert_val;
cin >> insert_val >> after_val;
ListNode* newNode = new ListNode(insert_val);
nodeMap[insert_val] = newNode;
ListNode* afterNode = nodeMap[after_val];
newNode->next = afterNode->next;
afterNode->next = newNode;
}
cin >> val;
if (head->val == val) {
head = head->next;
} else {
ListNode* curr = head;
while (curr->next != nullptr) {
if (curr->next->val == val) {
curr->next = curr->next->next;
break;
}
curr = curr->next;
}
}
ListNode* curr = head;
while (curr != nullptr) {
cout << curr->val << " ";
curr = curr->next;
}
return 0;
}
import java.util.*;
public class Main {
static class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int headVal = sc.nextInt();
ListNode head = new ListNode(headVal);
Map<Integer, ListNode> nodeMap = new HashMap<>();
nodeMap.put(headVal, head);
for (int i = 0; i < n - 1; i++) {
int insertVal = sc.nextInt();
int afterVal = sc.nextInt();
ListNode newNode = new ListNode(insertVal);
nodeMap.put(insertVal, newNode);
ListNode afterNode = nodeMap.get(afterVal);
newNode.next = afterNode.next;
afterNode.next = newNode;
}
int deleteVal = sc.nextInt();
if (head.val == deleteVal) {
head = head.next;
} else {
ListNode curr = head;
while (curr.next != null) {
if (curr.next.val == deleteVal) {
curr.next = curr.next.next;
break;
}
curr = curr.next;
}
}
ListNode curr = head;
while (curr != null) {
System.out.print(curr.val + " ");
curr = curr.next;
}
}
}
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
inp = list(map(int, input().split()))
n, head_val = inp[0], inp[1]
head = ListNode(head_val)
node_map = {head_val: head}
idx = 2
for _ in range(n - 1):
insert_val, after_val = inp[idx], inp[idx + 1]
idx += 2
new_node = ListNode(insert_val)
node_map[insert_val] = new_node
after_node = node_map[after_val]
new_node.next = after_node.next
after_node.next = new_node
delete_val = inp[-1]
if head.val == delete_val:
head = head.next
else:
curr = head
while curr.next:
if curr.next.val == delete_val:
curr.next = curr.next.next
break
curr = curr.next
curr = head
while curr:
print(curr.val, end=' ')
curr = curr.next
算法及复杂度
- 算法:链表的构建和删除操作
- 时间复杂度:
O
(
n
)
\mathcal{O}(n)
O(n) - 需要遍历链表进行节点插入和删除操作
- 空间复杂度:
O
(
n
)
\mathcal{O}(n)
O(n) - 需要使用哈希表存储节点映射关系