链表的操作

链表中的插入(头插)
void *insertNode(ListNode *head, ListNode *node) {node->next = head;head = node;return;
}
链表中的插入(尾插)
void *insertNode(ListNode *head, ListNode *node) {ListNode *front = head;while(head)  {// 备份前一个节点front = head;head = head->next;}front->next = node;return;
}
链表中的插入
void *insertNode(ListNode *head, ListNode *node) {// 插入到结点7之后while(head&&!head->val==7)  head = head->next;// 先将结点7下一个结点的地址赋值给node的指针node->next = head->next;// 将node作为下一个结点head->next = node;return;
}
链表中的删除
void *deleteNode(ListNode *head, ListNode *node) {ListNode *front = head;while(head&&!head==node)  {// 备份前一个节点front = head;head = head->next;}front->next = head->next;return;
}
链表中的查找
bool *deleteNode(ListNode *head, int value) {while(head&&!head->val==value)  {head = head->next;}if(head==NULL) return false;     // 没找到else return true; // 找到了
}

链表操作的一些技巧

  1. 链表精髓在于指针移动
  2. 特别注意 空指针 时的情况,无论开头还是结尾都要考虑,尤其是 p->next == NULL ? 要特别注意
类型一:反转数列
ListNode *reverseList(ListNode *head, int mid) {ListNode *newHead = NULL;while(mid--) {// 备份主链的下一个节点 ListNode *node = head->next;// 更新head的next指针,指向子链头指针 head->next = newHead;// 更新子链头指针 newHead = head;// 更新主链头指针 head = node;}return newHead;
}
类型二:快慢指针

第几第几这种可以使用快慢指针或者双指针

ListNode *detectCycle(ListNode *head) {ListNode *fast = head;ListNode *slow = head;ListNode *meet = NULL;while(fast&&fast->next&&fast->next->next) {fast = fast->next->next;slow = slow->next;if(fast==slow) {meet = fast;break;}}if(fast==NULL||fast->next==NULL||fast->next->next==NULL) {return NULL;}while (head) {if(meet == head) {return meet;}meet = meet -> next;head = head -> next;}return NULL;
}
类型三:巧设头指针
ListNode* partition(ListNode* head, int x) {ListNode frontHead(0);ListNode afterHead(0);ListNode *front = &frontHead;ListNode *after = &afterHead;while (head) {if (head->val < x) {front -> next = head;front = head;} else {after -> next = head;after = head;}head = head -> next;}front->next= afterHead.next;after->next = NULL;return frontHead.next;
}
类型四:创建新节点
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {// 巧设头结点 ListNode a(0);ListNode *ans = &a;int carry = 0;ListNode *p = NULL;  // 精髓while(l1&&l2) {int num = l1->val+l2->val + carry;if(num>=10){int rest = num % 10;carry = 1;p = new ListNode(rest); // 精髓ans->next = p;// 移动ans指针 ans = p; } else {carry = 0;p = new ListNode(num);ans->next = p;// 移动ans指针 ans = p; } l1 = l1->next;l2 = l2->next;}while(l1) {int num = l1->val + carry;if(num>=10){int rest = num % 10;carry = 1;p = new ListNode(rest);ans->next = p;// 移动ans指针 ans = p; } else {carry = 0;p = new ListNode(num);ans->next = p;// 移动ans指针 ans = p; } l1 = l1->next;}while (l2) {int num = l2->val + carry;if(num>=10){int rest = num % 10;carry = 1;p = new ListNode(rest);ans->next = p;// 移动ans指针 ans = p; } else {carry = 0;p = new ListNode(num);ans->next = p;// 移动ans指针 ans = p; } l2 = l2->next;}return a.next;
}

双链表

为了克服单链表的上述缺点,引入了双链表,双链表结点中有两个指针 front 和 next,分别指向其前驱结点和后继结点

双链表的插入

// 将node插入到head之后
node->next = head->next; // ①
head->next->front = node;    // ②
node->front = head;     // ③
head->next = node;      // ④

双链表的删除

head->next = node->next;  // ①
node->next->front = head;    // ②

循环链表

循环单链表:循环单链表和单链表的区别在于,表中最后一个结点的指针不是NULL,而改为指向头结点,从而整个链表形成一个环

循环双链表:由循环单链表的定义不难推出循环双链表,不同的是在循环双链表中,头结点的 prior指针还要指向表尾结点

在循环双链表工中,某结点*p为尾结点时,p->next==L; 当循环双链表为空表时,其头结点的 front 域和 next 域都等于 L。

【数据结构-线性表】顺序表和链表(几种链表操作技巧+几种链表形式)相关推荐

  1. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

    原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...

  2. 线性表→顺序表→链表 逐个击破

    一. 线性表 1. 前言 线性表,全名为线性存储结构.使用线性表存储数据的方式可以这样理解,即 " 把所有(一对一逻辑关系的)数据用一根线儿串起来,再存储到物理空间中 ".这根线有 ...

  3. 线性表-顺序表的基本操作

    线性表的定义和特点 线性表:由n(n≥0)个数据特性相同的元素构成的有限序列 线性表中元素的个数n(n≥0)称为线性表的长度 空表:n=0 对于非空的线性表或线性结构,特点为: 存在唯一的一个被称作& ...

  4. [数据结构]数据结构简介和顺序表

    目录 什么是数据结构 数据结构的特性 线性表 顺序表 创建一个动态顺序表 顺序表的增删查改 尾插和尾删除 尾插 头插头删 头插 头删 任意位置的插入和删除 插入 删除 查找和打印 总结 这天,小明和小 ...

  5. 数据结构之——《顺序表》

    数据结构之--<顺序表> 1.含义 2.分类 3.接口函数实现 4.顺序表的优缺点 1.含义 顺序表示用一段纹理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组 ...

  6. 数据结构学习心得——顺序表

    一.线性表的定义 线性表是具有相同特性数据元素的一个有限序列.该序列中所含元素的个数叫做线性表的长度,用n(n>0)表示. 二.线性表的存储结构 线性表的存储结构有顺序存储和链式存储两种.前者称 ...

  7. 【数据结构】【顺序表】 SqList *L与SqList*L的区别

    [数据结构][顺序表] SqList *&L与SqList*L的区别 显然,对于顺序表的抽象数据模型中的函数,其参数使用各不相同. SqList *&L的情况 它的意思是,L是对Lis ...

  8. 数据结构之动态顺序表(含游戏菜单)

    上一篇文章我们谈了数据结构的静态顺序表,以及实现了静态顺序表,具体可以看我的上一篇文章->>>数据结构之静态顺序表. 我们可以知道,静态顺序表的缺点是:  因为使用的是定长数组,所以 ...

  9. 数据结构一线性表 (顺序表、单链表、双链表)

    版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 文章目录 1.线性表及其逻辑结构 1.1 线性表的定义 1.2 线性表的抽象数据类型描述 2.线性表的顺序存 ...

最新文章

  1. 从事仪表专业学c语言有用吗,测控专业就业方向有哪些 就业前景比你想象中的好...
  2. 十、LINQ查询之延迟执行
  3. c语言主调函数和被调函数,在C语言中,何为主调函数和被调函数,他们之 – 手机爱问...
  4. php如何编写通信协议,定制通讯协议
  5. 冠榕智能灯光控制协议分析(controller-node)
  6. 用GDB调试程序(11)──查看运行时数据(2)-转
  7. java 复制Map对象(深拷贝与浅拷贝)
  8. MyBatis源码阅读(五) ---Mapper接口的获取过程
  9. 大数据技术原理与应用学习笔记(五)
  10. 【Python实践】Python部分实际案例解答1
  11. 火狐浏览器安装有道翻译插件
  12. 中国移动的固网宽带免费?想多了,收费快接近中国电信了,它已从中获取近千亿收入...
  13. 公历转农历的程序(代码转载于网络)
  14. 清华同方的计算机硬件设置,清华同方台式计算机如何设置BIOS引导U盘教程
  15. 台式主机插入耳机没声音
  16. 2021年氧化工艺新版试题及氧化工艺复审考试
  17. JavaScript 实例:当当网 首页选项卡切换效果
  18. 【图】广度与深度遍历
  19. 构成中学计算机教学系统的要素包括,教学策略就是对完成特定的教学目标而采用的教学活动的()要素的总体考虑...
  20. IDEA插件系列(49):PowerMouse插件——鼠标手势

热门文章

  1. 关于XML文档操作类
  2. JQuery选择器一般方法
  3. 火车头下载文件并发布到木翼下载系统
  4. C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断和引用
  5. 跨链Cosmos(9)异构跨链交易流程
  6. 区块链BaaS云服务(16)天德链TDBC“监管”
  7. CSS之关系选择器、属性选择器、伪类选择器
  8. python——迭代器
  9. [Issue Fixed]-分卷压缩解压:gzip: stdin: not in gzip format
  10. Golang和Ethereum中的big.Int