单链表
来源:互联网 发布:游族网络股票诊断 编辑:程序博客网 时间:2024/06/05 15:23
单链表
链表是由结点链接而成,每个结点包含指针域和数据域,其中数据域存储数据元素信息,指针域存储直接后继位置。
我们将链表种第一个结点的存储位置叫做头指针,为了更加方便地对链表进行操作,将会在第一个结点前增加一个结点,称为头结点。
1.定义结点类
struct ListNode{ int val; ListNode *next; ListNode(int x=0xFFFF) :val(x), next(nullptr) {}};
2.定义链表类
class LinkedList{public: LinkedList(); ~LinkedList(); void CreateHead(int n); void CreateTail(int n); bool isEmpty() const; int Find(const int e) const; int GetItem(int i) const; void Insert(int i, const int e); void DeleteEle(const int e); void DeleteLoc(const int i); void Display() const; void Clear();private: ListNode *head;};
CreateHead 方法:使用头插法建立拥有n个元素的单链表;
CreateTail 方法:使用头插法建立拥有n个元素的单链表;
isEmpty 方法:判断链表是否为空;
Find 方法:查找元素并返回该元素在链表中的位置;
GetItem 方法:返回链表中第i个位置的元素值;
Insert 方法:在链表第i个位置插入元素;
DeleteEle 方法:删除链表中第一次出现的值为e的元素;
DeleteLoc 方法:删除链表中位置为i的元素;
Display 方法:按照一定格式打印链表;
clear 方法:整表删除。
3.方法实现
LinkedList::LinkedList(){ head = new ListNode();}LinkedList::~LinkedList(){ ListNode *p = head; ListNode *tmp = p->next; while (tmp) { p->next = tmp->next; delete tmp; tmp = p->next; } delete head;}void LinkedList::CreateHead(int n){ ListNode *p = head; for (int i = 0; i < n; i++) { ListNode *node = new ListNode(i + 1); node->next = p->next; p->next = node; }}void LinkedList::CreateTail(int n){ ListNode *p = head; for (int i = 0; i < n; i++) { ListNode *node = new ListNode(i + 1); node->next = p->next; p->next = node; p = node; }}bool LinkedList::isEmpty() const{ return head->next == nullptr;}int LinkedList::Find(const int e) const{ ListNode *p = head->next; int j = 0; while (p && p->val != e) { p = p->next; j++; } if (!p) { return -1; } return j;}int LinkedList::GetItem(int i) const{ ListNode *p = head; int j = 0; while (p->next && j < i) { p = p->next; j++; } if (j > i || !p->next) { return -1; } return j;}void LinkedList::Insert(int i, const int e){ ListNode *p = head; int j = 0; while (p && j < i) { p = p->next; j++; } if (i > j || !p) { return; } ListNode *s = new ListNode(e); s->next = p->next; p->next = s;}void LinkedList::DeleteEle(const int e){ ListNode *p = head->next; ListNode *tmp = head; while (p->next && p->val != e) { p = p->next; tmp = tmp->next; } tmp->next = p->next; delete p;}void LinkedList::DeleteLoc(const int i){ ListNode *p = head; int j = 0; while (p->next && j < i) { p = p->next; j++; } if (j > i && !p->next) { return; } ListNode *tmp = p->next; p->next = tmp->next; delete tmp;}void LinkedList::Display() const{ ListNode *p = head; while (p->next) { std::cout << p->val << "->"; p = p->next; } std::cout << p->val << std::endl;}void LinkedList::Clear(){ ListNode *p = head; ListNode *tmp = p->next; while (tmp) { p->next = tmp->next; delete tmp; tmp = p->next; }}
1 0
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 【PAT】1114. Family Property (25)
- C# 复选列表框 和 imageList组件
- 【python tkinter】登陆界面
- Client
- 第32篇 一对多自由控制语音(十一)及php AJAX
- 单链表
- asp.net发布网站错误
- 51nod 1010 只包含因子2 3 5的数
- 入门训练 A+B问题
- centOS 7 初次安装的许可问题
- 【Struts2】文件上传(一个文件和多个文件)
- 原码, 反码, 补码 详解
- PAT 1006 换个格式输出整数
- Cocos2d-x3.2与OpenGL渲染总结(一)Cocos2d-x3.2的渲染流程