算法之循环链表

循环链表:单链表的基础上,首位相应,形成一个环,取第一项和末尾项,时间复杂度为0(1)

意义:感觉不到太大的意义,主要是任意位置能够对整表进行循环遍历,

code:

package math;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;

import math.SingleLinkList.Obj;

/**
 * @author bin
 * date : 15/1/5
 * desc : 实现循环链表 由于写了单链表 这个就简单写下,主要是单链表闭合成一个环
 *        让最后一项 内存地址 指向首项
 */
public class LoopLinkList {
    public List l;
    public int currentLen;//当前长度
    public Map m;
    public String address;//

    public class Obj{
        private String address;
        private Object obj;

        public Obj(String str,Object o){
            this.address = str;
            this.obj = o;
        }
        public Obj(){

        }
    }
    public LoopLinkList(){
        this.currentLen = 0;
        //初始化,内存地址
        this.address = this.getUUid();
        //初始化map
        m = new HashMap();
    }
    public void creatList(int i){
        this.check(i);
        Random r = new Random();
        String tempStr = new String();
        String uuid = new String();
        int rint;
        for (int j = 0; j < i; j++) {
            rint =  r.nextInt(40);
            System.out.println(rint);
            uuid  = this.getUUid();
            Obj o = new Obj(uuid, rint);
            if(j == 0){
            //当前的记录
                m.put(address, o);
            }else if(j == i-1){
                o = new Obj(address,rint);
                m.put(tempStr, o);
            }else{
                m.put(tempStr, o);
            }
            tempStr = uuid;
            currentLen = currentLen+1;
            }
        }
    public Object getEle(int i){
        this.check(i);
        int start = 0;
        Obj o = new Obj();
        if(currentLen < 1 ){
            throw new RuntimeException("不合理得参数");
        }else if(i > currentLen){
            throw new RuntimeException("越界错误");
        }else{
            while (start <= i-1) {
                if(start == 0){
                    o = (LoopLinkList.Obj) m.get(address);
                }else{
                    //System.out.println(m.get(o.address).toString());
                    o = (LoopLinkList.Obj) m.get(o.address);
                }
                start++;
            }
            return o;
        }
    }

    public void loop(Obj o){
        int count = 0;
        System.out.println("-------------------");
        System.out.println(o.obj);
        while (count < currentLen-1) {
            o = (Obj) m.get(o.address);
            System.out.println(o.obj);
            count++;
        }
    }
    public static void main(String[] args) {
        LoopLinkList l = new LoopLinkList();
        l.creatList(10);
        LoopLinkList loop = new LoopLinkList();
        Obj o = loop.new Obj();
        o = (Obj) l.getEle(4);
        l.loop(o);

    }
        public void check(int i){
            if(i<=0){
                throw new RuntimeException("不合法得参数");
        }
    }

    //生成唯一得地址信息
    public String getUUid(){
        UUID uuid = UUID.randomUUID();
        return uuid.toString();
    }
}

结果,

13
27
23
31
23
14
6
27
31
27
-------------------
31
23
14
6
27
31
27
13
27
23
时间: 2024-08-26 13:37:11

算法之循环链表的相关文章

数据结构和算法分析(9)表栈和队列的实际应用(一)

    在接下来的几篇博文中,将介绍表.栈.队列在编程实践中的应用.     (1)表达式求值:     输入一个中缀表达式,操作符包括(+ - * / ^).转化为后缀表达式之后并计算表达式的值: 要求: 1.输入的中缀表达式必须是一个完整的字符串: 2.不限制数字的位数和正负,负数用()括起来: 代码如下: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define EmptyT

POJ读书笔记6.1 - 约瑟夫问题 2746

http://blog.csdn.net/pipisorry/article/details/39271139 问题描述: 约瑟夫生死问题的描述有三: [其一]据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Josephus和他

2014年软考程序员-常考知识点复习笔记【第三章】

51CTO学院,在软考备考季特别整理了"2014年软考程序员-常考知识点复习笔记[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考程序员-常考知识点复习笔记[汇总篇]  2.线性表 (1) 性表的链式存储方式及以下几种常用链表的特点和运算:单链表.循环链表,双向链表,双向循环链表. (2)单链表的归并算法.循环链表的归并算法.双向链表及双向循环链表的插入和删除算法等都是较为常见的考查方式. (3)单链表中设置头指

010给定一个循环链表,实现一个算法返回这个环的开始结点 (keep it up)

给定一个循环链表,实现一个算法返回这个环的开始结点. 定义: 循环链表:链表中一个结点的指针指向先前已经出现的结点,导致链表中出现环. 例子: 输入:A -> B -> C -> D -> E -> C [结点C在之前已经出现过] 输出:结点C 可以用一个map<node*,bool> 就解决问题了. 下面是编程之美上一种奇特的解法:快慢指针解法. 代码: struct SNode { int data; SNode* next; }; SNode* findCi

数据结构与算法 1 :基本概念,线性表顺序结构,线性表链式结构,单向循环链表

[本文谢绝转载] <大纲> 数据结构: 起源: 基本概念 数据结构指数据对象中数据元素之间的关系  逻辑结构 物理结构 数据的运算 算法概念: 概念 算法和数据结构区别 算法特性 算法效率的度量 大O表示法 时间复杂度案例 空间复杂度 时间换空间案例 1)线性表: 线性表初步认识: 线性表顺序结构案例 线性表顺序结构案例,单文件版 线性表的优缺点 企业级线性表链式存储案例:C语言实现 企业级线性表链式存储案例:C语言实现 单文件版 企业级线性表链式存储案例,我的练习  线性表链式存储优点缺点

数据结构与算法之六 双向链表和循环链表

在本章中,你将学习: 执行双链接列表 执行循环链接列表 应用链接列表以解决编程问题 现在,考虑一个示例,您需要以降序的方式显示这些数字. 如何解决此问题? 每一个节点链接到序列中的下一个节点,这意味着您只能以正向遍历列表,这样的链接列表称为单链接列表.要以降序的方式显示数字,您需要反转此链接列表. 运用算法以反转单链接列表. 1.声明三个变量/ 指针, ptr1. ptr2和 ptr 3. 2. 2.如果列表中仅有一个节点: 3. a.退出. 3. 3.使列表中的第一个节点为 ptr1. 4.

字符单链表识别数字,字母,其它字符,并分为三个循环链表的算法c++实现

已知一个单链表中的数据元素含有三类字符(即字母字符,数字字符和其它字符),试编写算法,构造三个循环链表,使每个循环链表中只含有同一类的字符,且利用原表中的结点空间作为这三个表的结点空间. 实现源代码: #include<iostream> #include<stdio.h> #include<string.h> using namespace std; struct node { char ch; node*link; }; //为了方便输出,定义一个输出字符的函数,适

编程算法 - 圆圈中最后剩下的数字(循环链表) 代码(C++)

圆圈中最后剩下的数字(循环链表) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 0,1...,n-1这n个数字排成一个圆圈, 从数字0开始每次从这个圆圈里删除第m个数字. 求出这个圆圈里最后剩下的数字. 使用循环链表, 依次遍历删除, 时间复杂度O(mn), 空间复杂度O(n). 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ #include <iostr

数据结构与算法(四)-线性表之循环链表

前言:前面几篇介绍了线性表的顺序和链式存储结构,其中链式存储结构为单向链表(即一个方向的有限长度.不循环的链表),对于单链表,由于每个节点只存储了向后的指针,到了尾部标识就停止了向后链的操作.也就是说只能向后走,如果走过了,就回不去了,还得重头开始遍历,所以就衍生出了循环链表 一.简介 定义:将单链表中中断结点的指针端有空指针改为指向头结点,就使整个单链表形成一个环,这种头尾详解的单链表称为单循环链表,简称循环链表: 特性: 若链表为空,则头结点的next结点还是指向其本身,即head.next