有一个非空整数单链表L,设计一个算法删除值重复的节点,多个值相同的节点仅保留第一个。 输入 8 1 4 1 2 2 1 3 4 输出 1 4 2 3 样例输入 8 1 4 1 2 2 1 3 4 样例输出 1 4 2 3用c++语言输出上述完整程序代码
时间: 2024-09-21 18:09:56 浏览: 54
在C++中,我们可以使用迭代的方式来解决这个问题。首先,我们需要定义一个结构体`ListNode`表示链表节点:
```cpp
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
```
然后我们编写一个函数`removeDuplicates(ListNode* head)`,这个函数会遍历链表,删除重复的节点,只保留每个值的第一个实例:
```cpp
ListNode* removeDuplicates(ListNode* head) {
if (head == nullptr || head->next == nullptr) return head; // 如果链表为空或者只有一个元素,直接返回
ListNode* dummy = new ListNode(0); // 创建虚拟头节点
dummy->next = head;
ListNode* current = dummy;
while (current->next != nullptr) {
ListNode* temp = current->next;
while (temp != nullptr && temp->val == current->val) { // 当找到当前值相同的下一个节点
temp = temp->next;
}
current->next = temp; // 更新当前节点的next指针跳过已处理的部分
current = current->next; // 移动到下一次检查点
}
return dummy->next; // 返回结果链表的新头部
}
```
现在你可以将上述代码复制到一个C++文件中,并创建一个main函数来测试它:
```cpp
int main() {
ListNode* list = createLinkedListFromSampleInput("1 4 1 2 2 1 3 4"); // 创建链表
ListNode* result = removeDuplicates(list);
printLinkedList(result); // 打印输出结果
return 0;
}
// 辅助函数用于创建链表
ListNode* createLinkedListFromSampleInput(const std::string& input) {
// ...(这里你需要实现从字符串转换为链表的功能)
}
// 辅助函数用于打印链表
void printLinkedList(ListNode* head) {
// ...(这里你需要实现打印链表节点值的功能)
}
```
记得实现`createLinkedListFromSampleInput`和`printLinkedList`这两个辅助函数,它们分别用于根据给定的输入字符串构建链表以及打印链表。完成后运行`main`函数即可得到预期的结果。
阅读全文