链表

双链表的基本操作---插入,删除,交,并,相邻元素的交换,不相邻元素的交换

你。 提交于 2020-02-07 15:42:52
这个链表是带有表头的双链表。实现链表的一些规范操作,初始化,插入,删除等。包括两个头文件list.h,fatal.h,库函数list.c,测试函数testlist.c。头文件放的都是函数声明,库函数list.c放的的函数的定义。 头文件list.h 1 typedef int ElementType; 2 #ifndef _List_H 3 struct Node; 4 typedef struct Node *PtrToNode; 5 typedef PtrToNode List; 6 typedef PtrToNode Position; 7 #include<stdbool.h> 8 List MakeEmpty(List L); 9 void DeleteList(List L); 10 bool IsEmpty(List L); 11 bool IsLast(Position P, List L); 12 Position Find(ElementType X, List L); 13 void Delete(ElementType X, List L); 14 void Insert(ElementType X, List L,Position P); 15 Position Header(List L); 16 Position First(List L); 17

反转链表(C实现)

自作多情 提交于 2020-02-07 11:42:20
反转链表 单向线性表linklist反转 之前链表反转做到过n多遍,因为反转链表做法有很多种,每次想法都不一样,一旦思考都要花时间想,一不小心还会报错,今天把链表的流程图画一下,重新记一种方式,一种方式做到底。 List Reverse ( List L ) { List p , q ; p = L -> Next ; L -> Next = NULL ; // 先将头链表next指针置空 // q要始终指向L的next,做为已排好序列的第一个元素 // p要指向待排序列的第一个元素,p为空则序列全部反转 while ( p ) { q = p ; p = q -> Next ; q -> Next = L -> Next ; L -> Next = q ; } return L ; } 理解图和思路到时候自然就能写出 来源: CSDN 作者: NICEDAYSS 链接: https://blog.csdn.net/qq_35050438/article/details/103854403

数据结构学习分享

点点圈 提交于 2020-02-07 09:43:31
数据结构学习分享 本人大一新生,最近在自学数据结构,写博客监督自己的学习成果.所以我怀着沉重的心情开始写博客。刚开始不怎么会用这个编译器,还请各位前辈大佬多多包含,多多指导。 我们从链表开始分享,首先,是链表的创建。 1.链表的创建 话不多说先上代码。 struct list //链表的结构体 { int num ; struct list * next ; } ; struct list * create ( int n ) //这里的n用来存储链表的长度; { int i ; struct list * p ; struct list * head ; p = head = ( struct list * ) malloc ( sizeof ( struct list ) ) ; //首先创键head节点,p节点。 for ( i = 0 ; i < n ; i ++ ) //循环用来输入数据 { struct list * s = ( struct list * ) malloc ( sizeof ( struct list ) ) ; /*一个临时节点s*/ s -> num = i ; //我们这里为了方便,直接将i的值赋值给节点,在实际的创建中,可以在这里用scanf输入数据 p -> next = s ; //将p连接上s p = s ; //然后p再到s上 } p

[LintCode]链表求和

蓝咒 提交于 2020-02-07 08:40:39
问题分析: 我们通过遍历两个链表拿到每个位的值,两个值加上前一位进位值(0或者1)模10就是该位的值,除以10就是向高位的进位值(0或者1)。 由于两个链表可以不一样长,所以要及时判断,一旦为null,该位的值就要变成0。 有一种情况比较特殊,比如:1->1->1->null, 9->8->8->null,最终结果为0->0->0->1->null,需要保留最高位。 而1->1->1->null, 9->8->7->null,最终结果为0->0->9->null,则不需要保留最高位,最后应该加一个判断。 问题求解: public class Solution { public ListNode addLists(ListNode l1, ListNode l2) { ListNode preListNode = new ListNode(0); ListNode nowListNode = new ListNode(0); ListNode resultListNode = null; int val = 0;// 当前位置的数 int add = 0;// 进位 while (l1 != null || l2 != null) { //该位的数值 val = ((l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + add)

JAVA数据结构——单链表

一个人想着一个人 提交于 2020-02-07 07:21:30
链表: 一、 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性: 1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间。并把原有的数据元素复制进新的存储空间。 2. 因为顺序表要求数据的存储位置不仅是逻辑上相邻而且物理存储上也要相邻,所以当对数据进行增删操作的时候则会引起平均一半的数据元素移动。 综上所述:适合静态存储、对数据元素很少增删操作,则优先选择顺序表,对需要对数据频繁执行插入和删除操作,则选择动态的线性表-链表,链式存储不需要逻辑上相邻的元 素物理上也相邻,所以链表也带来了一定的局限性,失去了随机存取的特点。所以根据需求进行选择。 二、使用JAVA实现单链表: 接口同顺序表: [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package com.usts.edu.list; /** * Created by Guanzhong Hu * Date :2019/12/27 * Description : 线性表 * Version :1.0 */ public interface Ilist { //

树转换为链表

匆匆过客 提交于 2020-02-07 07:07:11
二叉树的每个结点有两个指针,在不创建新结点的情况下,更改结点指针的指向可将二叉树转换为链表结构,二叉树中的左右结点变为链表中的左右结点。使用两个每个结点的两个指针可转换为双链表结构,只使用每个结点的右指针可转换为单链表结构。 1、若要把二叉搜索树转换为排序的双向链表,只需中序遍历树中的每个结点,遍历的过程中始终保存已生成链表的最右端结点,当遍历父亲结点的时候将父亲结点加入到左子树生成的链表的最右端结点的后面,接着再遍历父亲结点的右子树,整个遍历完成后的最右端结点即是链表的最右端结点。 二叉搜索树与双向链表Online Judge /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: TreeNode* Convert(TreeNode* pRootOfTree) { TreeNode *pLastNodeInList = NULL; Convert(pRootOfTree, &pLastNodeInList); while(pLastNodeInList && pLastNodeInList->left)

剑指offer 链表中环的入口节点

南笙酒味 提交于 2020-02-07 06:52:36
1.题目 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 来源:剑指offer 链接: https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=13&tqId=11208&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 2.我的题解 2.1 快慢追赶法 先看看在同一个环中快追慢需要的时间(快指针速度 2 ,慢指针速度 1 ,追上是指二者重合),分析一下站位: 假设二者位置重合,那么已经追上了; 假设快指针落后于慢指针一个位置,那么 1 单位时刻后快指针追上慢指针; 假设快指针落后于慢指针两个位置,那么 2 单位时刻后快指针追上慢指针; 假设快指针在慢指针前面一个位置,那么 len-1 时刻后快指针追上慢指针,其中 len 是环的长度; 一般地,如果快指针距离慢指针距离为 n (顺环方向计算距离),那么快指针追上慢指针需要 n 单位时间,因为快指针每单位时间可以追上慢指针 1 个单位距离; 显然快慢指针初始站位最大距离小于环的周长,最坏情况下为 len-1 ;该情况下快指针追上慢指针时慢指针移动了 len-1 单位距离,快指针移动了 2*len-2 单位距离;

LeetCode-237 删除链表中的节点

北城余情 提交于 2020-02-07 03:03:15
问题: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。 现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9. 示例 2: 输入: head = [4,5,1,9], node = 1 输出: [4,5,9] 解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9. 说明: 链表至少包含两个节点。 链表中所有节点的值都是唯一的。 给定的节点为非末尾节点并且一定是链表中的一个有效节点。 不要从你的函数中返回任何结果。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 分析:这道题的难度在于容易陷入思维误区,题干说明是删除节点,所以我们在想的是利用某种算法来删除给定的节点,但实际上这是不可能实现的,所以我们应该透过现象看本质,本质是将链表[4,5,1,9],转换为[4,5,9]

[剑指offer][leetcode.237]删除链表中的节点

随声附和 提交于 2020-02-07 02:35:58
题目 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。 现有一个链表 – head = [4,5,1,9],它可以表示为: 示例 1: 输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9. 示例 2: 输入: head = [4,5,1,9], node = 1 输出: [4,5,9] 解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9. 说明: 链表至少包含两个节点。 链表中所有节点的值都是唯一的。 给定的节点为非末尾节点并且一定是链表中的一个有效节点。 不要从你的函数中返回任何结果。 分析 和 删除链表中的节点 一样,都是删除节点,且给定的是指针。不过这道题更加简单一下,排除了只有一个元素以及尾节点的情况。所以用下一个节点来覆盖当前节点,移除下一个节点即可。 class Solution { public : void deleteNode ( ListNode * node ) { ListNode * p = node - > next ; node - > val = p - > val ; node - > next = p - >

浅谈如何学习数据结构与算法[@初学者]

自闭症网瘾萝莉.ら 提交于 2020-02-07 01:57:52
导语 所谓“数据结构”,一般来说是“数据结构与算法”,是NOIPer/NOIer、本科生、硕士生、程序员都会学的一门课程,是程序员的必修课。 数据结构为什么要学? 我们使用计算机,希望它能帮助我们解决各种各样的问题,但随着发展—— 我们希望它运行得更快, 希望它能处理更多数据,希望它做一些原本不可能的事情…… 计算机科学不断改变着这个世界,但代价可能是高昂的。 好的算法设计可以做得更好,而且可能很便宜;劣质的算法就不得不花费更高昂的代价。 事实上,我们可能认为提高算力就能忽略劣质算法的影响。诚然,我们也在努力提高计算机算力,但即使强如超级计算机,也无法挽救一个错误的算法。 希望很多人能正视这个问题,因为数据结构与算法真的值得学习。 学科基础 学习数据结构与算法不需要太多的基础知识,但需要你熟练掌握一门编程语言。 至少给你C/C++/Java/Python的代码你能看得懂,让你用自己熟练的编程语言能轻松实现,这样就很棒了。 至于二分查找、冒泡排序、数组之类的内容我觉得是一个刚刚入门计算机科学的孩纸就应该会的,所以就很基础,没啥可说的,该会,对吧?(比如你连冒泡排序都不会,你咋学快排啥的,对吧?) 最好有一些经验积累,我在学数据结构之前就能在一定程度上运用Java的集合框架,看过比如java.util.ArrayList啊,java.util.LinkedList这样的类的源码