C++语言请根据输入的逆序数据采用头插法创建一个单链表,然后删除相同的数据,仅保留一个。 【输入形式】逆序的数据,数据0代表输入结束 【输出形式】创建成功的原始单链表的数据,以及删除某些元素后的单链表的数据,其中相同数据仅保留一个 【样例输入】 9 9 8 8 7 6 5 5 4 0 【样例输出】 4 5 5 6 7 8 8 9 9 4 5 6 7 8 9
时间: 2024-01-06 11:03:16 浏览: 61
好的,这是一个比较基础的单链表操作题,我会尽量详细地回答你的问题。
首先,我们需要定义链表节点的结构体,包含数据域和指针域:
```cpp
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
```
然后,我们需要实现创建链表和删除重复元素的函数。
创建链表可以采用头插法,即每读入一个数,就创建一个新的节点,并将其插入到链表头部。最后返回头节点即可。
```cpp
ListNode* createList() {
int x;
ListNode* head = nullptr;
while (std::cin >> x && x != 0) {
ListNode* node = new ListNode(x);
node->next = head;
head = node;
}
return head;
}
```
删除重复元素可以采用双指针法,即用一个指针 p 遍历链表,另一个指针 q 指向 p 的下一个节点。如果 p 和 q 指向的值相等,则删除 q 节点,并更新 p 的 next 指针,否则 p 和 q 同时向后移动。
```cpp
void removeDuplicates(ListNode* head) {
ListNode* p = head;
while (p != nullptr && p->next != nullptr) {
ListNode* q = p->next;
if (p->val == q->val) {
p->next = q->next;
delete q;
} else {
p = q;
}
}
}
```
最后,我们可以将创建链表和删除重复元素的函数组合起来,完成整个题目。
```cpp
void solve() {
ListNode* head = createList();
ListNode* p = head;
while (p != nullptr) {
std::cout << p->val << " ";
p = p->next;
}
std::cout << std::endl;
removeDuplicates(head);
p = head;
while (p != nullptr) {
std::cout << p->val << " ";
p = p->next;
}
std::cout << std::endl;
}
```
完整代码如下:
阅读全文