本文共 11514 字,大约阅读时间需要 38 分钟。
所为链表就是指线性表采用链式存储,用一组任意的存储单元来存放线性表的数据元素
。空间消耗
上,链表要比顺序表的多
。离散
的存储在存储空间中,因此链表也是非随机存取
的存储结构。NULL
时,链表为空。头结点
。头指针始终指向链表的第一个结点
。class LNode{ private: int data; LNode* next;};
LNode::LNode(){ this->data = 0; this->next = NULL;}
头插法和尾插法
。LNode* s = new LNode();s->data = value;s->next = L->next;L-next=s;
LNode* p = L;LNode* s = new LNode();s->data = value;p->next = s;p=s;
采用头插法生成的链表的元素顺序与数据输入的顺序是相反的,而尾插法生成的链表的元素的顺序与数据输入的顺序是一致的。
bool LNode::init(int* a, int len){ LNode* s; LNode* p = this; try { for (int i = 0; i < len; i++) { s = new LNode(); s->data = a[i]; p->next = s; p = s; } return true; } catch (exception e) { cout << e.what() << endl; return false; }}
bool LNode::isEmpty(){ if (this->next == NULL) return true; return false;}
int LNode::getValue(int index){ if (!this->isEmpty()) { int count = 1; LNode* p = this->next; if (index == 0) return this->data; if (index < 1) return NULL; while (p && count < index) { p = p->next; count++; } return p->data; } return -1;}
LNode* LNode::getIndex(int value){ if (this->isEmpty()) return NULL; LNode* p = this->next; while (p != NULL && p->data != value) p = p->next; return p;}
int LNode::value(){ return this->data;}
int LNode::length(){ if (this->isEmpty()) return 0; LNode* p = this->next; int count = 0; while (p) { count++; p = p->next; } return count;}
//获取指定下标的前驱LNode* LNode::getPre(int index){ if (this->isEmpty()) return NULL; LNode* p = this->next; for (int i = 1; i < index - 1; i++) p = p->next; return p;}// 获取指定下标的后件LNode* LNode::getNext(int index){ if (this->isEmpty()) return NULL; LNode* p = this->next; for (int i = 1; i <= index; i++) p = p->next; return p;}
追加和插入
。追加是在尾部增加元素,而插入是在序列中的某个位置插入,链表由于是离散存储,所以进行插入操作时不必像顺序表那样,需要移动插入位置之后的元素以空出位置进行插入,链表的插入操作只需修改指针的链接指向
。 因此链表的元素增加的时间复杂度都是常数阶
,这时链表的特点。代码如下://单链表插入bool LNode::insert(int index, int value){ if (this->isEmpty()) return false; int len = this->length(); if (index <= 0 || index > len) return false; LNode* p = this->getPre(index); LNode* s = new LNode(); s->data = value; s->next = p->next; p->next = s; return true;}//单链表追加bool LNode::append(int value){ if (this->isEmpty()) return false; LNode* p = this->next; while (p->next) p = p->next; LNode* s = new LNode(); s->data = value; p->next = s; return true;}
bool LNode::change(int index, int value){ if (this->isEmpty()) return false; int len = this->length(); if (index <= 0 || index > len) return false; LNode* p = this->getPre(index + 1); p->data = value;}
bool LNode::del(int index){ if (this->isEmpty()) return false; int len = this->length(); if (index <= 0 || index > len) return false; LNode* p = this->getPre(index); LNode* q = p->next; p->next = q->next; free(q);}
void LNode::show(){ LNode* p = this->next; while (p) { cout << p->data << " "; p = p->next; } cout << endl;}
void LNode::Ascending(){ LNode* p = this->next; LNode* q = p->next; while (p) { q = p->next; while (q) { if (p->data > q->data) { int t = p->data; p->data = q->data; q->data = t; } q = q->next; } p = p->next; }}
class LNode{ private: int data; LNode* next;public: LNode(); bool init(int* a, int len); int value(); int getValue(int index); void show(); LNode* getIndex(int value); bool insert(int index, int value); bool del(int index); bool isEmpty(); LNode* getPre(int index); LNode* getNext(int index); int length(); bool append(int value); bool change(int index, int value); void Ascending();};
class DNode{ private: int data; DNode* prior, * next;public: DNode(); bool init(int a[], int len); void show(); void insert(int index, int value); void del(int index);};
DNode::DNode(){ this->data = 0; this->prior = nullptr; this->next = nullptr;}bool DNode::init(int a[], int len){ try { DNode* p = this; DNode* s = new DNode(); s->data = a[0]; s->prior = p; p->next = s; p = s; for (int i = 1; i < len; i++) { s = new DNode(); s->data = a[i]; s->prior = p; p->next = s; p = s; } return true; } catch (exception e) { cout << e.what() << endl; return false; }}
void DNode::insert(int index, int value){ DNode* p = this->next; for (int i = 1; i < index - 1; i++) p = p->next; DNode* s = new DNode(); s->data = value; s->prior = p; s->next = p->next; p->next = s;}
void DNode::del(int index){ DNode* p = this->next; for (int i = 1; i < index; i++) p = p->next; DNode* t = p->prior; t->next = p->next; p->next->prior = t; delete p;}
单循环和双循环
。分别是用单链表构造和用双链表构造。next
指针进行循环,让最后一个数据结点的next
指针指向头结点,如下图: 判断下一结点是否就是头结点
,用代码表示就是:if(p->next==p) return true;return false;
追加元素的下一个结点指向头结点。
O(1)
的时间复杂度,若设头指针,要操作尾结点时则必须遍历到尾结点才能进行,时间复杂度为O(n)
。0
,这样的话0 就不能作为有效数据。游标
;由于是用数组描述,因此静态链表初始化时,需要预先分配足够的空间。 动态链表
。class SNode{ int data; int next;};
next==-1
来表示最后一个结点,插入、删除操作与动态链表一样,只需修改指针,不用移动元素。// 将链表从(a1,a2,a3...an)变成(a1,an,a2,an-1....)void LNode::changeList(){ LNode* p, * q, * r, * s; p = q = this; while (q->next != NULL) { p = p->next; q = q->next; if (q->next != NULL)q = q->next; } q = p->next; p->next = NULL; while (q != NULL) { r = q->next; q->next = p->next; p->next = q; q = r; } s = this->next; q = p->next; p->next = NULL; while (q != NULL) { r = q->next; q->next = s->next; s->next = q; s = q->next; q = r; }}// 从链表中删除绝对值相同的元素,保留第一个元素void LNode::delSameAbsolut(){ LNode* p = this, * r; int* q, m; int n = this->length(); q = new int[n + 1]; for (int i = 0; i < n + 1; i++) *(q + i) = 0; while (p->next != NULL) { m = p->next->data > 0 ? p->next->data : -(p->next->data); if (*(q + m) == 0) { *(q + m) = 1; p = p->next; } else { r = p->next; p->next = r->next; free(r); } } free(q);}// 查找链表中倒数第k个元素的值int LNode::searchK(int k){ LNode* p = this->next, * q = this->next; int count = 0; while (p != NULL) { if (count < k)count++; else q = q->next; p = p->next; } if (count < k) return 0; else { cout << q->data << endl; return 1; }}// 提取两个链表中的公共元素作为一个新链表返回,并且不破坏原来的两个链表void LNode::getCommon(LNode* l, LNode*& newL){ LNode* p = this->next, * q = l->next, * r, * s; r = newL; while (p != NULL && q != NULL) { if (p->data < q->data) p = p->next; else if (p->data > q->data) q = q->next; else if (p->data == q->data) { s = new LNode(); s->data = p->data; r->next = s; r = s; p = p->next; q = q->next; } } r->next = NULL;}// 将两个递增顺序的链表合并为一个递增顺序的新链表void LNode::merge(LNode* l){ LNode* r, * pa = this->next, * pb = l->next; this->next = NULL; while (pa && pb) { if (pa->data <= pb->data) { r = pa->next; pa->next = this->next; this->next = pa; pa = r; } else { r = pb->next; pb->next = this->next; this->next = pb; pb = r; } } if (pa) pb = pa; while (pb) { r = pb->next; pb->next = this->next; this->next = pb; pb = r; }}//去掉增序链表中值相同的多余元素,即去重void LNode::DelSame(){ LNode* p = this->next, * q; if (p == NULL) return; while (p->next != NULL) { q = p->next; if (p->data == q->data) { p->next = q->next; free(q); } else { p = p->next; } }}// 将一个链表按照序号的奇偶分别拆成两个链表LNode* LNode::divide(){ int i = 0; LNode* B = new LNode(); LNode* ra = this, * rb = B; LNode* p = this->next; this->next = NULL; while (p != NULL) { i++; if (i % 2 == 0) { rb->next = p; rb = p; } else { ra->next = p; ra = p; } p = p->next; } ra->next = NULL; rb->next = NULL; return B;}//寻找两个链表的公共结点LNode* LNode::searchCommon(LNode* L1){ int len1 = this->length(); int len2 = L1->length(); int dist; LNode* longL, * shortL; if (len1 > len2) { longL = this->next; shortL = L1->next; dist = len1 - len2; } else { longL = L1->next; shortL = this->next; dist = len2 - len1; } while (dist--) longL = longL->next; while (longL != NULL) { if (longL == shortL) return longL; else { longL = longL->next; shortL = shortL->next; } } return NULL;}// 删除值在指定范围内的元素的值bool LNode::RangeDel(int min, int max){ if (this->isEmpty()) return false; LNode* pre = this, * p = this->next; while (p != NULL) { if (p->data > min && p->data < max) { pre->next = p->next; free(p); p = pre->next; } else { pre = p; p = p->next; } }}//使用插入排序使链表增序void LNode::insertSort(){ LNode* p = this->next, * pre; LNode* r = p->next; p->next = NULL; p = r; while (p != NULL) { r = p->next; pre = this; while (pre->next != NULL && pre->next->data < p->data) pre = pre->next; p->next = pre->next; pre->next = p; p = r; }}//就地逆置链表void LNode::reverse(){ // r 为 p 的后继,用于防止断链 LNode* p, * r; p = this->next; this->next = NULL; while (p != NULL) { r = p->next; p->next = this->next; this->next = p; p = r; }}//删除链表中的最小值bool LNode::DelMin(){ if (this->isEmpty()) return false; // 工作指针 LNode* pre = this, * p = pre->next; // 存储最小值的相关指针 LNode* minpre = pre, * minp = p; while (p != NULL) { if (p->data < minp->data) { minp = p; minpre = pre; } pre = p; p = p->next; } minpre->next = minp->next; free(minp); return true;}//逆序输出链表void ReversePrint(LNode* L){ if (L->next != NULL) ReversePrint(L->next); if (L != NULL && L->data != 0) cout << L->data << " ";}// 删除链表中所有值等于x的结点bool LNode::DelX(int x){ if (this->isEmpty()) return false; LNode* p = this->next, * pre = this, * q; while (p != NULL) { if (p->data == x) { q = p; p = p->next; pre->next = p; free(q); } else { pre = p; p = p->next; } } return true;}
转载地址:http://vqqgn.baihongyu.com/