循环链表

python实现单向循环链表

匿名 (未验证) 提交于 2019-12-02 22:51:30
普通单链表和单向循环链表的不同之处在于单向循环链表成环,在这种情况下链表指针移动到尾部的判定条件要发生改变,增删改查也要发生改变,但还是以本博客的"python实现单链表"中的代码为基础来实现的。 # 单向循环链表 class Node(object): """节点类""" def __init__(self,elem): self.elem = elem self.next = None class SingLinkList(object): """单向循环链表类""" def __init__(self,node=None): self.__head = node if node: node.next = node def is_empty(self): """判断链表是否为空""" return self.__head == None def length(self): """返回链表的长度""" #如果是空链表则返回0 if self.is_empty(): return 0 #cur游标移动,从而实现遍历元素的功能 cur = self.__head #count用来计数 count = 1 while cur.next != self.__head: count += 1 #让cur游标可以向下移动 cur = cur.next return count def

Java数据结构 - 双向循环链表

匿名 (未验证) 提交于 2019-12-02 21:52:03
class DoubleLoopNode { // 上一个节点 DoubleLoopNode pre ; // 下一个节点 DoubleLoopNode next ; // 节点的内容 int data ; public DoubleLoopNode ( int value ) { this . pre = this ; this . next = this ; this . data = value ; } // 插入节点 public void append ( DoubleLoopNode node ) { // 原来的下一个节点 DoubleLoopNode nextNode = this . next ; // 把新节点作为当前节点的下一个节点 this . next = node ; // 把当前节点作为新节点的前一个节点 node . pre = this ; // 让原来的下一个节点作为新节点的下一个节点 node . next = nextNode ; // 让原来的下一个节点的上一个节点为新节点 nextNode . pre = node ; } // 获取下一个节点 public DoubleLoopNode next () { return this . next ; } // 获取上一个节点 public DoubleLoopNode pre () {

【数据结构】链表

纵然是瞬间 提交于 2019-12-01 12:30:05
链表和数组: 链表是一个相对简单的数据结构,与数组不同的是,它并不需要一块连续的内存空间,而是通过指针将一组零散的内存块串联起来使用。 单链表: 我们吧内存块称为链表的结点,为了将所有的结点串起来,每个链表的结点除了存储数据意外,还需要记录链上的下一个结点的地址。这个记录下个结点的指针叫做后继指针next。 我们习惯吧的第一个结点称为头结点,把最后一个结点叫做尾结点。其中,头系欸但用来记录链表的基地址,而尾结点指向一个空地址Null,表示这是链表上的最后一个结点。 单链表的查找、插入,删除操作: 在进行数组的插入、删除操作时,为了保持内存数据的连续性,需要做大量的数据搬移,所以时间复杂度为o(n),而链表插入或者删除数据,由于本身链表的存储空间本身不是连续的,只需要考虑相邻结点的指针改变,其对应的时间复杂度为o(1)。 相对的,链表不能通过下标的随机访问高效访问第K个元素,只能根据指指针一个结点一个结点地依次遍历。其时间复杂度为o(n)。 循环链表和双向链表: 循环链表是一种特殊地单链表,其唯一区别在于循环链表指针指向头结点,适合处理具有环形结的数据,比如约瑟夫问题。 单向链表只有一个方向,结点只有一个后继指针next指向后面的结点,而双向链表多了一个前驱指针prev指向前面的结点。由于双向链表需要额外的空间来存储前驱结点的地址,所以双向链表要比单链表占用更多的内存空间

面试官: 既然已经有数组了,为什么还要链表

血红的双手。 提交于 2019-11-30 03:50:53
面试官: 既然已经有数组了,为什么还要链表 本文发布于微信平台: 程序员面试官 超过20w字的「前端面试与进阶指南」可以移步 github 对于不少开发者而言,链表(linked list)这种数据结构既熟悉又陌生,熟悉是因为它确实是非常基础的数据结构,陌生的原因是我们在业务开发中用到它的几率的确不大. 在很多情况下,我们用数组就能很好的完成工作,而且不会产生太多的差异,那么链表存在的意义是什么?链表相比于数组有什么优势或者不足吗? 什么是链表 链表是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer). 从本质上来讲,链表与数组的确有相似之处,他们的相同点是都是线性数据结构,这与树和图不同,而它们的不同之处在于数组是一块连续的内存,而链表可以不是连续内存,链表的节点与节点之间通过指针来联系. 当然,链表也有不同的形态,主要分为三种:单向链表、双向链表、循环链表. 单向链表 单向链表的节点通常由两个部分构成,一个是节点储存的值 val ,另一个就是节点的指针 next . 链表与数组类似,也可以进行查找、插入、删除、读取等操作,但是由于链表与数组的特性不同,导致不同操作的复杂度也不同. 查找性能 单向链表的查找操作通常是这样的: 从头节点进入,开始比对节点的值,如果不同则通过指针进入下一个节点 重复上面的动作

循环链表及线性表的情况分析

六眼飞鱼酱① 提交于 2019-11-30 02:47:10
循环链表的应用之约瑟夫环问题以及线性表总结之顺序表与链表的比较   1.1问题说明   问题描述:编号为1,2,···,n的n个人围坐在一圆桌旁,每人持有一个正整数的密码。从第一个人开始报数,报到一个预先约定的正整数m时,停止报数,报m的人退席,下一个人又重新从1开始报数,依此重复,直至所有的人都退席。编一程序输出他们退席的编号序列。例如,设m=20,n=7,7个人的密码依次是3,1,7,2,4,8,4,则退席的人的编号依次为6,1,7,5,3,2,4。   基本要求:用不带表头结点的循环单链表表示围成圆圈的n个人;要求建立此循环单链表;某人离席相当于删除一个结点,要正确设置程序中循环终止的条件和删除结点时指针的修改变化。   1.2代码实现   #include   #include   #define NULL 0   typedef int ElemType;   typedef struct LNode{   ElemType data;   ElemType sequence;   LNode *next;   }LNode,*LinkList;   //创建一个不带头节点的循环单向链表   void createCircularList(LinkList &L, int n){   printf("依次输入数据元素:\n");   //输入第一个元素,即头节点  

2019.9.17-单向循环链表:遍历+求长度+添加元素(完整代码)

可紊 提交于 2019-11-29 22:30:20
# coding:utf-8 class Node(object): """節點0""" def __init__(self, elem): self.elem = elem self.next = None # node = None(100) class SingleLinkList(object): """單向循環鏈表""" def __init__(self, node=None): self.__head = node if node: node.next = node def is_empty(self): """鏈表是否爲空""" return self.__head == None def length(self): """鏈表長度""" if self.is_empty(): return 0 # cur遊樸,用來移動遍歷節點 cur = self.__head # count記錄數量 count = 1 while cur.next != self.__head: count += 1 cur = cur.next return count def travel(self): """遍歷整個鏈表""" cur = self.__head while cur.next != self.__head: print(cur.elem, end=" ") cur =

线性表

不打扰是莪最后的温柔 提交于 2019-11-29 12:36:55
顺序表   顺序表是采用顺序结构存储的线性表。顺序表是将所有元素放到一块连续的存储空间中,特点是存取速度快,但是不可以动态增加长度。 链表   链表是采用链式结构存储的线性表。链表中的元素在存储空间中的位置不一定是连续的,所以链表使用结点来存储元素,每个节点中还存储了相邻节点位置信息。由于不是连续存储,存取元素的速度比顺序表差。但是只要存储空间足够,链表就可以动态增加长度,也就是说,相较于顺序表,链表能更快速地进行元素的插入和删除操作。   链表需要一个头指针head来表示链表的第一个结点。根据结点中存储的相邻结点信息的不同,链表又可以细分为单向链表和双向链表。若链表的第一个结点和最后一个结点相连,则该链表又可以称为循环链表。 单向链表   单向链表的结点中只保存了直接后继结点的位置信息。也就是说,结点中有一个next指针指向该结点的直接后继结点,若该结点是最后一个结点,则next取null。      单向链表的结点结构定义如下: 1 public class LNode<E> { 2 3 public E data; 4 5 public LNode<E> next; 6 7 public LNode(E data) { 8 this.data = data; 9 } 10 11 } LNode   单向链表的插入分为三种情况:    在前面插入

循环链表实现

自古美人都是妖i 提交于 2019-11-29 10:14:49
注意事项: 循环链表设置尾指针。由于在链表的操作过程中,尾指针会不断变化,所以在一些函数的形参中都设置指向头指针的指针。以及链表的结束判断条件变成q是否等于尾指针。 注意传递的实参需要取地址 循环链表的优势在于双链表合并,以及实现尾插法简单(首先新建结点指向头结点,然后把尾指针的next域指向该新建结点) 在创建链表时,使用尾插法,而不是用头插法(因为头插法很难去更新尾指针,使得最后尾指针还需额外更新一次),直接用头插法建立的是头指针,而非尾指针 #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node * next; }Node, *LinkList; LinkList Creat(); void Destroy(LinkList *L); void Insert(LinkList *L, int val, int index); void Delete(LinkList *L, int index); void Traverse(LinkList L); int main() { LinkList L = Creat(); Traverse(L); Insert(&L, 1, 5); printf("After inserting is :\n"); Traverse(L);

循环链表拆分

别说谁变了你拦得住时间么 提交于 2019-11-29 06:39:00
循环链表拆分【C语言】 题目: 将一个 循环链表 表示的 稀疏多项式 分解成两个 多项式 ,使得这两个多项式中各自仅含 奇数项 或者 偶数项 时间复杂度任意 空间复杂度为O(1) 代码: /*10*/ # include <stdio.h> # include <stdlib.h> # define elemtype int int num = 0 ; typedef struct cNode { elemtype data1 ; /*单项式的系数*/ elemtype data2 ; /*单项式的指数*/ struct cNode * next ; } cNode ; typedef cNode * Circlelist ; void Initlist ( Circlelist * L ) { * L = ( Circlelist ) malloc ( sizeof ( cNode ) ) ; ( * L ) -> next = * L ; /*建立空的循环单链表*/ } void CreateFromTail ( Circlelist L ) { int i = 0 ; cNode * r , * s ; r = L ; elemtype a , b ; while ( i != num ) { scanf ( "%d%d" , & a , & b ) ; s = (

java实现单向循环链表

北城余情 提交于 2019-11-28 14:41:49
链表图解 带头结点的链表: 不带头结点的链表: 区别 带头结点的链表容易代码实现 不带头结点的容易实现循环链表和双向链表 代码的实现 (增减 删除) 节点实现: public class node { private int no; public node next; public node(int no) { this.no = no; } public int getNo() { return no; } @Override public String toString() { return "Node [no=" + no + "]"; } } 链表实现: public class linkedList { private node head;//头结点 public linkedList() { } public boolean add( node newhero) {//添加节点 boolean isSuccessful=false; if(head==null){//处理空表 head=newhero; newhero.next=head; isSuccessful=true; }else{//不为空时 node node= head; while(true){ if (node.next==head){ break; } node=node.next; } node