首页 > 其他分享 >数据结构——链表

数据结构——链表

时间:2024-09-27 12:23:07浏览次数:3  
标签:Node head val nullptr next 链表 数据结构 节点

c++数据结构p3

链表

  • 链表的每一个节点都是独立分配出来的
  • 从当前节点能够找到下一个节点
    Node(链表)=date(数据域)+next(地址域)
    地址域:存储的是下一个节点的地址
    最后一个地址域是nullptr
struct Node{
  int data;
  Node *next;
}

特点:每一个节点都是在堆内存上独立new出来的。节点内存不连续
优点:

  1. 内存利用率高,不需要大块连续内存
  2. 插入和删除节点不需要移动其他节点,时间复杂度O(1)
  3. 不需要专门进行扩容操作

缺点:

  1. 内存占用空间大,每一个节点多出存放地址的空间
  2. 内存不连续,无法进行内存的随机访问
  3. 链表的搜索效率不高,只能从节点开始逐节点遍历
#include <iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;

//节点类型
struct Node {
	Node(int data = 0) :data_(data), next_(nullptr) {}
	//节点类型的构造函数
	int data_;
	Node* next_;
};

//单链表代码实现
//只有在找尾节点指针才指向下一个
class Clink {
public:
	Clink() {
		//给head_初始化指向指向头节点
		head_ = new Node();
	}
	~Clink() {
		//delete []head_;删除数组类指针[]指针
		//head_=nullptr;
		//链表遍历每一个节点
		Node* p = head_;
		while (p != nullptr) {
			head_ = head_->next_;
			delete p;
			p = head_;
		}
		head_ = nullptr;
	}
public:
	//单链表尾插法  O(n)
	//若head_:头节点  tail_:尾节点  O(1)
	void insertTail(int val) {
		//先找的当前链表的末尾节点
		Node* p = head_;
		while (p->next_ != nullptr) {
			p = p->next_;
		}
		//生成新的节点
		Node* node = new Node(val);
		//把生成的新节点挂在尾节点后面
		p->next_ = node;
	}
	//单链表头插法
	void insertHead(int val) {//O(1)
		Node* node = new Node(val);
		node->next_ = head_->next_;
		head_->next_ = node;
	}
	//单链表删除第一个节点
	//删除0(1),搜索+删除0(n)
	void Remove(int val) {
		Node* q = head_;
		Node* p = head_->next_;
		while (p != nullptr) {
			if (p->data_ == val) {
				q->next_ = p->next_;
				delete p;
				return;
			}
			else {
				q = p;
				p = p->next_;
			}
		}
	}
	//单链表删除多个节点
	void RemoveAll(int val) {
		Node* q = head_;
		Node* p = head_->next_;
		while (p != nullptr) {
			if (p->data_ == val) {
				q->next_ = p->next_;
				delete p;
				//对指针p进行重置
				p = q->next_;
			}
			else {
				q = p;
				p = p->next_;
			}
		}
	}
	//搜索  list  O(n)数组搜索 下表访问/随机访问arr[i] O(1)     搜索O(n)
	bool Find(int val) {
		Node* p = head_->next_;
		while (p->next_ != nullptr) {
			if (p->data_ == val) {
				return true;
			}
			else {
				p = p->next_;
			}
		}
		return false;
	}
	//链表的打印
	void Show() {//从第一个节点打印到最后一个节点
		Node* p = head_->next_;
		while (p != nullptr) {
			cout << p->data_ << " ";
			p = p->next_;
		}
		cout << endl;
	}
private:
	Node* head_;//指向链表的头节点
};


int main() {
	Clink link;
	srand(time(0));
	for (int i = 0; i < 10; i++) {
		int val = rand() % 100;
		link.insertHead(val);
		cout << val << " ";
	}
	cout << endl;

	link.insertTail(200);
	link.Show();

	link.Remove(200);
	link.Show();


	return 0;
}



标签:Node,head,val,nullptr,next,链表,数据结构,节点
From: https://blog.csdn.net/Bulling_/article/details/142532442

相关文章

  • 【LeetCode Hot 100】21. 合并两个有序链表
    题目描述最简单粗暴的想法是将两个链表的所有元素拿出来放在一个数组中,再将此数组排序,最后生成一个新链表并返回。由于给出的参数本身就是两个排好序的链表,可以进行一次遍历,就能保证元素仍然是有序的:每次比较当前指针指向的两个元素的大小,较小的拿出来作为当前元素并将指针向前移......
  • [Python手撕]重排链表
    #Definitionforsingly-linkedlist.#classListNode:#def__init__(self,val=0,next=None):#self.val=val#self.next=nextclassSolution:defreorderList(self,head:Optional[ListNode])->None:""&quo......
  • 链表
    链表SingleListArrayList的缺陷在熟悉并且自己写了一个ArrayList顺序表的底层架构的时候发现ArrayList是利用数组来存储数据的效率比较低:这里说两个例子在插入以及删除的时候ArrayList都需要移动剩余的元素在开始的时候设置了初始的内存后续需要扩容这里也是效率低......
  • log型数据结构优化DP解题报告(uoj)
    交作业用T220417最长公共上升子序列不难看出状态同最长公共子序列,但由于上升条件限制,加一个限制:\(f_{i,j}\)表示\(a_{1...i}\)匹配\(b_{1...j}\)且\(a_i\)必须做结尾的最长公共上升子序列长度转移方程为\(f_{i,j}=f_{i,j-1}\)(if\(a_i\neqb_j\))\(f_{i,j}=\max_{k......
  • 数据结构之——队列
    一、队列概述        队列是一种操作受限的线性表,其限制条件为允许在表的一端进行插入,而在表的另一端进行删除。插入的一端叫做队尾,删除的一端叫做队头。向队列中插入新元素的行为称为进队,从队列中删除元素的行为称为出队。例如军训的时候,都排成一列,有头有尾。假设你......
  • 【JAVA-数据结构】包装类&简单认识泛型(1)
        这篇包含包装类和泛型相关知识,会用两篇文章进行讲解。1包装类        在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。1.1基本数据类型和对应的包装类除了Integer和Character......
  • 数据结构:实现链式结构二叉树(Tree) 手把手带你入门数据结构~
    文章目录前言一、链式结构二叉树的概念1.定义2.节点结构3.操作4.优势与劣势二、链式结构二叉树的实现1.树结构的定义2.树的遍历(1)前序遍历(2)中序遍历(3)后序遍历3.二叉树结点个数4.二叉树叶子结点个数5.二叉树第k层结点个数6.二叉树的深度/高度7.二叉树查找值为......
  • 算法记录——链表
    2.链表2.1判断是否是回文链表1.方法一:利用栈反转链表/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,Lis......
  • Map 数据结构
    Map是一种键值队的集合,和对象Object类似。两者的区别:一、Map和Object的区别键的类型:在Map中,键可以是任何类型(包括对象、函数、undefined、NaN等等);而在Object中,键只能是字符串或者符号。有序性:在Map中,键值对是按照插入(添加)的顺序排列的;而Object不能保证顺序二、创建:创......
  • 算法与数据结构——快速排序
    快速排序快速排序(quicksort)是一种基于分治策略的排序算法,运行高效,应用广泛。快速排序的核心操作是“哨兵划分”,其目标是::选择数组中的某个元素作为“基准数”,将所有小于基准数的元素移到其左侧,而大于基准数的元素移到其右侧。具体流程如下:选取数组最左端元素作为基准数,初始化......