删除带头节点单链表l中重复的节点c语言
时间: 2024-10-15 08:26:47 浏览: 45
在C语言中,删除单链表`l`中的重复节点通常是通过遍历链表并比较节点值来实现的。这里提供一种基本的方法:
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
void deleteDuplicates(Node** l) {
if (*l == NULL) return; // 空链表不需要处理
Node* current = *l;
while (current != NULL) {
Node* nextTemp = current->next;
// 如果当前节点的数据和下一个节点的数据相同,则跳过这个重复的节点
while (nextTemp != NULL && nextTemp->data == current->data) {
nextTemp = nextTemp->next;
}
// 将指向最后一个不同数据节点的指针更新回下一个非重复节点
current->next = nextTemp;
// 移动到下一个节点
current = nextTemp;
}
}
```
这个函数接受链表头结点的地址作为输入,它会遍历链表,如果遇到重复的节点,则跳过它们,直到找到下一个不同值的节点。最后,链表中的重复节点将不会被包含在结果中。
相关问题
在带头节点单链表L中查找值为X的节点,如果找到返回该节点位置,否则返回NULL。用C语言
在C语言中,我们可以创建一个函数来遍历单链表并在其中查找特定值。假设链表的每个节点都有一个整数值和指向下一个节点的指针。这里有一个简单的示例:
```c
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 查找值为X的节点的函数
Node* searchLinkedList(Node* head, int X) {
Node* current = head; // 初始化当前节点为头节点
// 遍历链表
while (current != NULL) {
// 如果当前节点的数据等于目标值,返回当前节点
if (current->data == X) {
return current;
}
current = current->next; // 移动到下一个节点
}
// 没有找到值为X的节点,返回NULL
return NULL;
}
```
在这个函数中,我们首先检查头节点是否就是我们要找的那个,如果不是,就逐个检查后面的节点,直到找到值为X的节点或者遍历完整个链表为止。
尾插法创建有序的带头节点单链表c语言代码
尾插法(Tail Insertion)是指将新的元素插入到已排序链表的末尾,保持链表的有序性。在C语言中,这种操作可以简化插入过程,因为无需在每个位置查找合适位置。下面是使用尾插法创建有序链表的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建链表节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 尾部插入新节点,保持有序
void insertAtEnd(Node** head, int value) {
if (*head == NULL || value <= (*head)->data) {
// 如果链表为空或者新值小于等于头节点,作为头节点插入
Node* newNode = createNode(value);
if (newNode != NULL) {
newNode->next = *head;
*head = newNode;
}
} else {
// 否则,遍历到链表末尾插入
Node* current = *head;
while (current->next != NULL && current->next->data < value) {
current = current->next;
}
// 插入新节点
if (current->next != NULL) {
Node* newNode = createNode(value);
newNode->next = NULL;
current->next = newNode;
} else {
// 如果链表最后一个节点的数据大于新值,就直接在末尾插入
*head->next = createNode(value);
*head->next->next = NULL;
}
}
}
// 打印链表
void printList(Node* node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
int main() {
Node* head = NULL; // 初始化链表头部
// 使用尾插法插入有序元素
for (int i = 5; i >= 1; i--) { // 示例从5到1递减
insertAtEnd(&head, i);
}
// 打印链表验证是否按顺序排列
printList(head);
return 0;
}
```
阅读全文