深入理解链表的各类操作详解
什么是链表
链表是一种数据结构,它由一连串的节点(node)组成。每个节点包含一个数据域和一个指针域。指针指向下一个节点,最后一个节点的指针为NULL。链表有单向链表、双向链表、循环链表等不同的形式。
下面我们会详细介绍链表的操作。
链表的创建
链表的创建分为两个步骤:创建头节点和向链表插入元素。
创建头节点
头节点是链表的第一个节点,头节点的数据域可以为空,但是头节点的指针域应该指向链表的第一个元素。创建头节点的代码如下:
typedef struct Node
{
int data;
struct Node *next;
}Node;
Node *head = (Node*)malloc(sizeof(Node));
head->next = NULL;
向链表插入元素
向链表插入元素有两种方法:头插法和尾插法。在头插法中,新节点插入链表头部,而在尾插法中,新节点插入链表尾部。
头插法
头插法的实现代码如下:
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = 1;
newNode->next = head->next;
head->next = newNode;
尾插法
尾插法的实现代码如下:
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = 1;
newNode->next = NULL;
Node *p = head;
while(p->next != NULL)
{
p = p->next;
}
p->next = newNode;
链表的删除
链表的删除分为两种情况:删除节点和删除整个链表。
删除节点
删除节点的方法是:找到需要删除的节点的前驱节点,然后修改前驱节点的指针域,使其跳过需要删除的节点即可。
删除节点的代码如下:
Node *p = head;
while(p->next != NULL)
{
if(p->next->data == 1)
{
Node *delNode = p->next;
p->next = delNode->next;
free(delNode);
break;
}
p = p->next;
}
删除整个链表
删除整个链表实际上就是依次删除每个节点,直到链表为空。
删除整个链表的代码如下:
Node *p = head->next;
while(p != NULL)
{
Node *delNode = p;
p = p->next;
free(delNode);
}
head->next = NULL;
链表的遍历
链表的遍历可以使用 while 循环和递归两种方法。
while 循环
使用 while 循环遍历链表的代码如下:
Node *p = head->next;
while(p != NULL)
{
printf("%d", p->data);
p = p->next;
}
递归
使用递归遍历链表的代码如下:
void traverse(Node *p)
{
if(p == NULL) return;
printf("%d", p->data);
traverse(p->next);
}
traverse(head->next);
链表的其他操作
链表的其他常见操作还包括插入指定位置、修改指定位置的值、获取链表的长度等。这些操作的实现方法和上述几种方法有些类似,这里就不再赘述。
示例
示例一
假设现在有一个链表:1 -> 2 -> 3 -> 4 -> 5,现在需要将链表逆序输出。
void reversePrint(Node *p)
{
if(p == NULL) return;
reversePrint(p->next);
printf("%d", p->data);
}
reversePrint(head->next);
该代码会输出:5 4 3 2 1
示例二
假设现在有一个链表:1 -> 2 -> 3 -> 4 -> 5,现在需要将链表中的偶数值节点删除。
Node *p = head;
while(p->next != NULL)
{
if(p->next->data % 2 == 0)
{
Node *delNode = p->next;
p->next = delNode->next;
free(delNode);
}
else
{
p = p->next;
}
}
该代码会把链表变为:1 -> 3 -> 5
总结
以上是链表的各种操作详解,掌握链表的重要性不言而喻,尤其在算法和数据结构方面能帮助开发者更深入理解算法和数据结构考试题目。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解链表的各类操作详解 - Python技术站