数据结构与算法学习笔记(三)

1.单链表

单链表是一种线性数据结构,由一系列节点组成,每个节点包含两个部分:数据域和指针域。数据域用于存储节点的数据,指针域用于指向下一个节点的地址。在单链表中,每个节点只有一个指针指向它的后继节点,而没有指向前驱节点的指针。单链表的头节点是第一个节点,尾节点是最后一个节点,尾节点的指针域指向一个特殊值NULL,表示链表的结束。

个人理解:

单链表需要两个类,第一个类(LinkList)用来创建头节点,头节点有且仅有一个,在头节点类中有这样一个其它类成员,简称节点类(Node),节点类中一般有多个数据和一个节点类对象成员,此对象不要在定义时初始化,不然就一直定义套娃了。且头节点类对象应该有一个数据用来记录当前链接到多少个节点,此处为N

还是用图来表示直接点

头节点类:

class LinkList
{
	

	Node *head;

	int N=0;

public:

	LinkList()
	{
		//初始化头节点和数据
		head = new Node("",NULL);

		N = 0;
	};

节点类:

class Node
{
public:
	string item;
	Node* next;

	Node(string item,Node *next) 
	{
		this->item = item;
		this->next = next;
	};
};

头节点本质上也是个节点,也有自己的数据对象,但一般用不上,随便初始化就行。

单节点:

 链表图解:

 通俗点说,头节点不是树枝分叉出多个枝条,而是树干不断增强自己,在生长的过程中有些部分生出枝条形成数据data。

链表雏形初步完善,接下来就是常规的增删操作。

结尾追加

void insert(string t)
	{
		Node *n = head;                    //从头节点开始
		while (n->next != NULL)            //如果有一个节点的下一个节点为NULL,那就是到末尾了
		{
			n = n->next;
		}

		Node *new_node = new Node(t, NULL);    //现场创建一个节点,并为其链接,注意它的下一个节点一定要为NULL

		n->next = new_node;

		N++;                                //别忘了节点数加加
	}

插入增加

void insert(int i, string t)
	{
		//先找到i的前一个节点
		Node *pre = head;
		for (int index = 0; index <= i-1; index++)//这里建议自己推理一下
		{                                         //我的第一个节点的我默认为0索引处
			pre = pre->next;                      //看自己怎么想,头节点为0索引也行
		}
		//找到i处的节点
		Node *curr = pre->next;
		//创建新节点,让其指向原i处节点,并让i-1处节点指向它

		Node *new_node = new Node(t, curr);

		new_node->next = curr;

		pre->next = new_node;    //i-1处指向

		N++;
	}

选择删除

string remove(int i)
	{
		//先找到i的前一个节点
		Node *pre =head;
		for (int index = 0; index <= i; index++)
		{
			pre = pre->next;
		}
		//再让i-1处节点指向i+1处节点,并断掉原i节点的指向

		Node *curr = pre->next;

		Node *next_node = curr->next;
		
		pre->next = next_node;
		
		N--;

		return curr->item;
	}

单链表可用来存储不确定的一组数据,它的长度大小不会像数组那样被规定。添加数据灵活,但是它没有规定意义上的索引值,查找数据始终要从头节点开始遍历查询,不像数组直接定位查找。并且多个指针的创建这使得链表需要更多内存存储。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值