链表操作总结:
链表是一种重要的数据结构。它是动态分配存储的一种结构。它可以根据需要开辟存储单元。
链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素,链表中的每一个元素
称为“结点”,每个结点包含两部分:1.实际数据data 2.下一个结点的地址next。表尾的地址部分存放“NULL”.
表示链表到此结束。
链表的各类操作包括:学习单向链表的创建、删除、 插入(无序、有序)、输出、 排序(选择、插入、冒泡)、反序等等。
那么链表该如何遍历呢,遍历链表需要从头到尾,访问每一个元素,直到链表尾。也就是说不断地访问当前节点的next,直到NULL。下面是链表的遍历输出:
#include <iostream>
using namespace std;
class node
{
public:
int value;
node *next;
node()
{
value = 0;
next = NULL;
}
};
int main()
{
node *head,*curr;
head = new node();
head->next = NULL;
head->value = 15;
for (size_t i = 0; i < 10; i++)
{
curr = new node();
curr->value = i;
curr->next = head;
head = curr;
}
while (head!=NULL)
{
cout << head->value << endl;
head = head->next;
}
}
链表相对于数组有个非常明显的优点就是能以时间复杂度o(1)完成一个节点的插入或者删除操作。
1.递归实现单链表逆置
tips:
(1)逆置不是指将原有链表逆序打印,逆置破坏了原有链表的结构;
(2)既然需要用递归实现,那首先要明白递归的本质。
我在接触递归时,常常纠结与递归的实现过程,根本没有理解递归的本质,我现在觉得,递归只需要关注以下几点:
- 算法是否可以用递归实现。感觉递