数据结构实现 2.1:链表(C++版)

本文介绍了链表作为线性结构的特点,采用C++实现链表类,包含增、删、改、查等基本操作,并对算法复杂度进行分析。文章通过引入虚拟头结点简化了代码实现,所有操作的时间复杂度均为O(n)级别。
摘要由CSDN通过智能技术生成

1. 概念及基本框架

链表 是一种 线性结构 ,而且存储上属于 链式存储(即内存的物理空间是不连续的),是线性表的一种。链表结构如下图所示:
链表
下面以一个我实现的一个简单的链表类来进一步理解链表。

template <class T>
class Node{
   
public:
	Node(T num = NULL, Node *next = NULL){
   
		m_data = num;
		this->next = next;
	}
public:
	T m_data;
	Node *next;
};

首先设计一个 结点类 ,这个结点类包含 数据指向下一个结点的指针 。结点类的构造函数可以直接对结点赋值,然后利用结点类对象来创建一个链表。链表类的设计如下:

template <class T>
class LinkedList{
   
public:
	LinkedList(){
   
		head.m_data = NULL;
		head.next = NULL;
		m_size = 0;
	}
	...
private:
	Node<T> head;
	int m_size;
};

这里为了避免重复设计就可以兼容更多数据类型,引入了 泛型 ,即 模板 的概念。(模板的关键字是 classtypename
这里的 m_size 表示 链表长度 。为了保护数据,这个变量以及 结点数据 都设置为 private
与动态数组不同,动态数组的“动态”含义是可以自动扩容(缩容),但实质还是静态的,而链表则实现了真正意义上的动态。因为只有需要一个结点,才会添加一个结点,不需要就会删除。在这里,为了下面程序代码编写方便、统一,引入了 虚拟头结点(也称 哨兵结点 )的概念。这个结点本身不存放数据,用户也不知道它的存在。
实现了前面的程序之后,接下来就是一个链表的增、删、改、查以及一些其他基本操作,接下来利用代码去实现。

2. 基本操作程序实现

2.1 增加操作

template <class T>
class LinkedList{
   
public:
	...
	//增加操作
	void add(int index, T num);
	void addFirst(T num);
	void addLast(T num);
	...
};

首先,在类体内进行增加操作函数的原型说明。这里包括三个函数:
add(添加到任意位置)
addFirst(添加到头部)
addLast(添加到尾部)
然后分别去实现它们。

template <class T>
void LinkedList<T>::add(int index, T num){
   
	if (index < 0 || index > m_size){
   
		cout << "添加位置非法!" << endl;
		return;
	}
	Node<T> *node = &head;
	for (int i = 0; i < index; ++i, node = node->next);
	node->next = new Node<T>(num, node->next);
	m_size++;
}
template <class T>
void LinkedList<T>::addFirst(T num){
   
	add(0, num);
}
template <class T>
void LinkedList<T>::addLast(T num){
   
	add(m_size, num);
}

由于这些函数在类体外,所以每个函数头部必须添加一行代码:

template <class T>

表示该函数使用模板,下面同理。
如果不使用虚拟头结点,代码编写就要区分第一个结点和其他结点,从这里可以看出引入虚拟头结点的好处,统一了代码编写形式,下面的同理。

2.2 删除操作

template <class T>
class LinkedList{
   
public:
	...
	//删除操作
	T remove(int index);
	T removeFirst();
	T removeLast();
	void removeElement(T num);
	...
};

同理,在类体内进行删除函数的原型说明。这里包括四个函数:
remove(删除任意位置元素):返回删除元素的值。
removeFirst(删除头部元素):返回删除元素的值。
removeLast(删除尾部元素):返回删除元素的值。
removeElement(删除特定元素):这里删除的是第一个这样的元素,如果想把这样的元素都删掉,可以写一个新的函数来实现。
然后分别去实现它们。

template <class T>
T LinkedList<T>::
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值