链表

Python----数据结构----链表----单向链表

耗尽温柔 提交于 2020-03-01 19:37:56
Python学习之路,点击有全套Python笔记 什么是链表 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。 单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。 表元素域elem用来存放具体的数据。 链接域next用来存放下一个节点的位置(python中的标识) 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。 实现: 步骤: is_empty() 链表是否为空 length() 链表长度 travel() 遍历整个链表 add(item) 链表头部添加元素 append(item) 链表尾部添加元素 insert(pos, item) 指定位置添加元素 remove(item) 删除节点 search(item) 查找节点是否存在 # 单链表 class Node : """节点""" def __init__ ( self , elem ) : self . elem = elem self . next = None node = Node ( 100 ) class SingleLinkList

Java编程的逻辑 (55) - 容器类总结

放肆的年华 提交于 2020-03-01 18:57:52
从38节到54节,我们介绍了多种容器类,本节进行简要总结,我们主要从三个角度进行总结: 用法和特点 数据结构和算法 设计思维和模式 用法和特点 我们在52节展示过一张图,其中包含了容器类主要的接口和类,我们还是用这个图总结一下: 容器类有两个根接口,分别是Collection和Map,Collection表示单个元素的集合,Map表示键值对的集合。 Collection表示的数据集合有基本的增、删、查、遍历等方法,但没有定义元素间的顺序或位置,也没有规定是否有重复元素。 List是Collection的子接口,表示有顺序或位置的数据集合,增加了根据索引位置进行操作的方法。它有两个主要的实现类,ArrayList和LinkedList,ArrayList基于数组实现,LinkedList基于链表实现,ArrayList的随机访问效率很高,但从中间插入和删除元素需要移动元素,效率比较低,LinkedList则正好相反,随机访问效率比较低,但增删元素只需要调整邻近节点的链接。 Set也是Collection的子接口,它没有增加新的方法,但保证不含重复元素。它有两个主要的实现类,HashSet和TreeSet,HashSet基于哈希表实现,要求键重写hashCode方法,效率更高,但元素间没有顺序,TreeSet基于排序二叉树实现,元素按比较有序,元素需要实现Comparable接口

算法学习笔记----Day18(双链表)

元气小坏坏 提交于 2020-03-01 18:30:56
今日学习 第一部分:双链表 一.双链表的定义及本质 1.每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。 2.代码实现: class Node ( object ) : '''结点定义''' def __init__ ( self , item ) : # item存放数据元素,next是下一结点的标识 self . item = item self . next = None self . prev = None class DoubleLinkList ( object ) : '''双链表定义''' def __init__ ( self , node = None ) : # _开头标识私有属性 self . _head = node def is_empty ( self ) : # 判断链表是否为空 return self . _head == None def length ( self ) : # 链表长度,cur初始指向头结点 count = 0 cur = self . _head while cur != None : count += 1 cur = cur . next return count def travel ( self ) : # 遍历整个链表 cur =

剑指offer_复杂链表的复制

谁说我不能喝 提交于 2020-03-01 18:14:42
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 首先想到的是直接复制 1 /* 2 public class RandomListNode { 3 int label; 4 RandomListNode next = null; 5 RandomListNode random = null; 6 7 RandomListNode(int label) { 8 this.label = label; 9 } 10 } 11 */ 12 public class Solution { 13 public RandomListNode Clone(RandomListNode pHead) 14 { 15 RandomListNode cur = pHead; 16 RandomListNode head = new RandomListNode(-1); 17 RandomListNode ans = head; 18 while(cur!=null){ 19 head.next = new RandomListNode(cur.label); 20 if(cur.random!=null) 21 head

面试题06. 从尾到头打印链表

让人想犯罪 __ 提交于 2020-03-01 18:12:49
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ import java . util . * ; class Solution { public int [ ] reversePrint ( ListNode head ) { /* Stack<Integer> stack = new Stack<>(); while(head != null){ stack.push(head.val); head = head.next; } int[] arr = new int[stack.size()]; for(int i = 0; i < arr.length; i++){ arr[i] = stack.pop(); } return arr; */ int len = 0 ; ListNode cur = head ; while ( cur != null ) { len ++ ; cur = cur . next ; } int [ ] arr = new int [ len ] ; for (

剑指offer 复杂链表的复制

邮差的信 提交于 2020-03-01 18:11:42
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 1 struct RandomListNode { 2 int label; 3 struct RandomListNode *next, *random; 4 RandomListNode(int x) : 5 label(x), next(NULL), random(NULL) { 6 } 7 }; 解法一: 分两步: 1、复制原始链表节点,并用next链接起来。 2、设置每个节点的random指针。假设原始链表的某个节点N的random指向节点S,由于S在链表中可能在N的前面也可能在N的后面,所以要定位S的位置需要从原始链表的头结点开始找。如果从原始链表的头结点沿着next经过s步找到节点S,那么在复制链表上节点N'的random(记为S')离复制链表的头结点的距离也是沿着next指针s步。用这种方法可以为复制链表上的每个节点设置random指针。 时间复杂度分析:对于一个有n个节点的链表,由于定位每个节点的random都需要从链表头结点开始经过 O(n)才能找到。因此总的时间复杂度为O(n 2 ) 解法二

[剑指offer] 25. 复杂链表的复制

北城余情 提交于 2020-03-01 18:04:29
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路: 因为新链表也需要复制旧链表的random指针,而random指向的节点也有其next和random,需要保持链表的连贯,所以需要考虑先做出一条新链表,再去构建每一个节点的random节点,而如何同步random节点就是问题所在。有两种解决办法。 解法一:构建同一链表后拆分 1.新旧链表构建在一起,形成Z字型 2.为每一个新节点同步random节点 3.分开两个链表 class Solution { public: RandomListNode *Clone(RandomListNode *pHead) { if (pHead == NULL) return NULL; RandomListNode *newHead = new RandomListNode(pHead->label); RandomListNode *curNode1 = pHead; RandomListNode *curNode2 = newHead; // 新旧链表形成Z链 while (curNode1) { curNode2->next = curNode1->next;

剑指Offer_25_复杂链表的复制

試著忘記壹切 提交于 2020-03-01 18:03:32
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 解题思路 首先遍历结点同时,复制结点插入原来的结点的后面。然后再遍历一遍,根据原来的结点的指针关系,设置特殊指针。如果原来一个结点 a 的特殊指针指向 b,那么其复制结点 a' 指向 b 的 next,也即 b'。遍历完成的,将复制的结点从原来的链表中分离出来。 实现 /*链表结点的定义*/ public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = label; } } /*实现*/ public class Solution { public RandomListNode Clone(RandomListNode pHead) { //copy RandomListNode p = pHead; while (p!=null){ RandomListNode node = new RandomListNode(p.label); node

复杂链表的复制

别说谁变了你拦得住时间么 提交于 2020-03-01 18:01:39
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 结点结构体如下: /* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } }; */ 这是一道剑指offer上的题目。下面看一下解析吧。 在做这道题之前,自己的想法是先把链表中的next域全部复制,这时候原复杂链表的random域的所有指向都会存在于刚才复制的链表中,之后再遍历原复杂链表,将新链表random域与原链表random域相互对应即可。 但是过程中问题就出现了,虽然我可以在将原链表的所有next域全部复制,也保证了即将要复制的random域的指向存在于该链表中,但是random域是随机指的,也就是说并不知道当前的random域指向的结点在前面还是后面,如此一来,如果还要继续下去,恐怕还要嵌套一层循环。 为此,又在网上找了大神的博客参考下,真的是受益匪浅。 想想我们平时复制粘贴一段文字的时候是怎么做的?是照着那段文字一个一个的再敲一次吗?并不是

25 复杂链表的复制Clone

你。 提交于 2020-03-01 18:00:24
题目: 复杂链表的复制 要求:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 图片来自于: https://www.cnblogs.com/edisonchou/p/4790090.html 写得不错,只不过是用C++写的 下面来分析不借助辅助空间的O(n)解法 首先这是初始的复杂链表 把所有的链表节点复制一遍,对<另一个特殊指针指向任意一个节点>先不操作 对<另一个特殊指针指向任意一个节点>进行复制 然后拆开 1 /* 2 public class RandomListNode { 3 int label; 4 RandomListNode next = null; 5 RandomListNode random = null; 6 7 RandomListNode(int label) { 8 this.label = label; 9 } 10 } 11 */ 1 public class Solution { 2 public RandomListNode Clone(RandomListNode pHead) { 3 //考虑特殊情况 4 if(pHead == null) { 5 return null;