From 5d70b127bebc84a04cd08174f62b05d400540b42 Mon Sep 17 00:00:00 2001 From: 24OI-bot <15963390+24OI-bot@users.noreply.github.com> Date: Wed, 17 Jul 2019 06:00:46 -0400 Subject: [PATCH] style: format markdown files with remark-lint --- docs/ds/linked-list.md | 151 ++++++++++++++++++++++--------------------------- 1 file changed, 68 insertions(+), 83 deletions(-) diff --git a/docs/ds/linked-list.md b/docs/ds/linked-list.md index ba9cf17b..4df297ea 100644 --- a/docs/ds/linked-list.md +++ b/docs/ds/linked-list.md @@ -1,4 +1,4 @@ -##何为链表 +\## 何为链表 链表和数组都可用于存储数据,其中链表通过指针来连接元素,而数组则是把所有元素按次序依次存储。 @@ -8,117 +8,102 @@ 数组可以方便的寻找读取数据,在随机访问中操作次数是 $O(1)$ 。但删除、插入的操作次数却是却是 $O(n)$ 次。 - -##构建链表 +\## 构建链表 关于链表的构建使用到指针的部分比较抽象,光靠文字描述和代码可能难以理解,建议配合作图来理解。 -###1.单向链表 +\###1. 单向链表 单向链表中包含数据域和指针域,其中数据域用于存放数据,指针域用来连接当前结点和下一节点。 -``` -struct Node { - int value; - Node *next; -}; -``` + struct Node { + int value; + Node *next; + }; -###2.双向链表 +\###2. 双向链表 双向链表中同样有数据域和指针域,不同之处在于指针域有左右(或上一个、下一个)之分,用来连接上一个节点、当前结点、下一个结点。 -``` -struct Node { - int value; - Node *left; - Node *right; -}; -``` + struct Node { + int value; + Node *left; + Node *right; + }; -##向链表中插入(写入)数据 +\## 向链表中插入(写入)数据 -###1.单向链表 +\###1. 单向链表 -``` -void insertNode(int i,Node *p){ - Node *node = new Node; - node->value = i; - node->next = p->next; - p->next = node; -} -``` + void insertNode(int i,Node *p){ + Node *node = new Node; + node->value = i; + node->next = p->next; + p->next = node; + } 具体过程可参考下面这张图。 ![](./images/linked-list1.png) -###2.单向循环链表 +\###2. 单向循环链表 上面介绍了简单的单向链表的插入数据,有时我们会将链表的头尾连接起来将链表变为循环链表 -``` -void insertNode(int i,Node *p){ - Node *node = new Node; - node->value = i; - node->next = NULL; - if (p == NULL) { - p = node; - node->next = node; - } - if (p != NULL) { - node->next = p->next; - p->next = node; - } -} -``` + void insertNode(int i,Node *p){ + Node *node = new Node; + node->value = i; + node->next = NULL; + if (p == NULL) { + p = node; + node->next = node; + } + if (p != NULL) { + node->next = p->next; + p->next = node; + } + } 由于是循环的链表,我们在插入数据时需要判断原链表是否为空,为空则自身循环,不为空则正常插入数据循环。具体过程可参考下面这张图。 ![](./images/linked-list2.png) -###3.双向循环链表 - -``` -void insertNode(int i,Node *p){ - Node *node = new Node; - node->value = i; - if(p==NULL){ - p = node; - node->left = node; - node->right = node; - } - if(p!=NULL){ - node->left = p; - node->right = p->right; - p->right->left = node; - p->right = node; - } -} -``` - -##从链表中删除数据 - -##1.单向(循环)链表 - -``` -void deleteNode(Node *p){ - p->value = p->next->value; - p->next = p->next->next; -} -``` +\###3. 双向循环链表 + + void insertNode(int i,Node *p){ + Node *node = new Node; + node->value = i; + if(p==NULL){ + p = node; + node->left = node; + node->right = node; + } + if(p!=NULL){ + node->left = p; + node->right = p->right; + p->right->left = node; + p->right = node; + } + } + +\## 从链表中删除数据 + +\##1. 单向(循环)链表 + + void deleteNode(Node *p){ + p->value = p->next->value; + p->next = p->next->next; + } 从链表中删除某个结点时,将 p 的下一个结点 (p->next) 的值覆盖给 p 即可,与此同时更新 p 的下下个结点。具体过程可参考下面这张图。 ![](./images/linked-list3.png) -##2.双向循环链表 +\##2. 双向循环链表 -``` -void deleteNode(Node *p){ - p->value = p->right->value; - p->left->right = p->right; - p->right->left = p->left; - p = p->right; -} -``` \ No newline at end of file + void deleteNode(Node *p){ + p->value = p->right->value; + p->left->right = p->right; + p->right->left = p->left; + p = p->right; + } -- 2.11.0