TLinkTLinkNodeTLinkNodeTLinkNodeTLinkNodeTLinkNodeTLinkNode

class TLinkNode>{

int size = 0;

TNode root = null;

TNode reverseRoot = null;

TNode reverseRootStack = null;

//查找链表中的结点

public TNode findNode(T data){

TNode p = root;

while(p != null){

if (p.getData() == data){

return p;

}

else{

p = p.getTail();

}

}

return null;

}

//返回根结点

public TNode findRoot(){

return root;

}

//返回使用递归反转后的根结点

public TNode findReverseRoot(){

return reverseRoot;

}

//返回使用栈反转结点的根结点

public TNode findReverseStackRoot(){

return reverseRootStack;

}

//链表使用栈进行反转(非循环链表)

public void ReverseRootStack(TNode node) {

TNode p = node;

Stack> stack = new Stack>();

while(p != null){

stack.push(p);

p = p.getTail();

}

while (!stack.isEmpty()){

TNode t = stack.pop();

t.setHead(null);

t.setTail(null);

if (reverseRootStack == null){

reverseRootStack = t;

}

else{

if (reverseRootStack.getTail() == null){

reverseRootStack.setTail(t);

t.setHead(reverseRootStack);

}

else{

TNode tt = null;

TNode pp = reverseRootStack;

while(pp != null){

tt = pp;

pp = pp.getTail();

}

tt.setTail(t);

t.setHead(tt);

}

}

}

}

//链表使用递归的方式进行反转(非循环链表)

public void printNodeDesc(TNode node){

int count = 0;

TNode p = node;

TNode t = null;

TNode tt = null;

while (p != null){

t = p;

p = p.getTail();

count++;

}

if (count == 0) {

return;

}

if (reverseRoot == null) {

t.getHead().setTail(null);

t.setHead(null);

reverseRoot = t;

}

else{

if (reverseRoot.getTail() == null){

t.getHead().setTail(null);

t.setHead(null);

reverseRoot.setTail(t);

t.setHead(reverseRoot);

}

else{

TNode pp = reverseRoot;

while (pp != null){

tt = pp;

pp = pp.getTail();

}

if (t.getHead() != null) {

t.getHead().setTail(null);

}

else{

node = null;

}

t.setHead(null);

tt.setTail(t);

t.setHead(tt);

}

}

printNodeDesc(node);

}

//打印链表中的每个结点

public void printNode(TNode node){

TNode p = node;

if (p != null){

//顺序输出

System.out.println("=== p.data ==>> " + p.getData() + ", p.head ==>> " + p.getHead() + ", p.tail ==>> " + p.getTail() + ", size ==>> " + size);

printNode(p.getTail());

//逆序输出

/*

System.out.println("=== p.data ==>> " + p.getData() + ", p.head ==>> " + p.getHead() + ", p.tail ==>> " + p.getTail() + ", size ==>> " + size);

*/

}

}

//判断链表中是否有循环结点

public T findCircle(TNode node){

TNode p = node;

TNode t = node;

while (p.getTail() != null){

p = p.getTail();

if (t.getTail().getTail() != null) {

t = t.getTail().getTail();

}

else{

return null;

}

if (p == t){

System.out.println("=== p.getData ==>> " + p.getData());

return p.getData();

}

}

return null;

}

//查找链表中的循环起点

public TNode findCircleData(TNode node){

TNode p = node;

List> list = new ArrayList<>();

while (p != null){

list.add(p);

for (int i = 0; i < list.size(); i ++){

if (list.get(i) == p.getTail()){

System.out.println("=== p.getTail.getData ==>> " + p.getTail().getData());

return p.getTail();

}

}

p = p.getTail();

}

return null;

}

/**

* 向链表中放入数据,此处只在链表尾端放入数据;

* 往链表头和链表中间插入数据逻辑都差不多,都是先查找到需要放入数据的结点,再改变新增数据前后的结点指针的指向;

* [@param](https://my.oschina.net/u/2303379) data

* [@return](https://my.oschina.net/u/556800)

*/

public boolean putData(T data){

size ++;

TNode node = root;

if(node == null){

//新建头节点,将第一个插入进来的数据作为链表的头结点

node = new TNode(data, null, null);

root = node;

}

else{

TNode p = node;

TNode t = node;

while(p != null){

t = p;

p = p.getTail();

}

TNode newData = new TNode(data, null, null);

t.setTail(newData);

newData.setHead(t);

/**

* 以下代码是将链表设置为循环链表,作测试使用

*/

/*

TNode pp = root;

if(size == 10){

while (pp != null){

if (pp.getData() == "banana"){

newData.setTail(pp);

break;

}

pp = pp.getTail();

}

}

*/

}

return true;

}

//从链表中更新结点

public boolean upData(T data, T newData){

TNode node = root;

while(node != null){

if (node.getData() == data){

node.setData(newData);

return true;

}

node = node.getTail();

}

return false;

}

//从链表中删除结点

public boolean delData(T data){

TNode node = root;

while(node != null){

if (node.getData() == data){

size --;

if (node == root){

if (node.getTail() != null){

root = node.getTail();

}

else{

root = null;

}

}

else{

//删除node结点

node.getHead().setTail(node.getTail());

node.getTail().setHead(node.getHead());

}

node.setHead(null);

node.setTail(null);

return true;

}

node = node.getTail();

}

return false;

}

}

//结点类

class TNode>{

private T data; //结点存储的数据

private TNode head; //结点头指针

private TNode tail; //结点尾指针

public TNode(T data, TNode head, TNode tail){

this.data = data;

this.head = head;

this.tail = tail;

}

public void setData(T data) { this.data = data; }

public void setHead(TNode head){ this.head = head; }

public void setTail(TNode tail){ this.tail = tail; }

public T getData(){ return this.data; }

public TNode getHead(){ return this.head; }

public TNode getTail(){ return this.tail; }

}

java链表源码_JAVA之链表源码 - 飞翔的南极企鹅的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java把abcedf字符串进行排序_字符串合并处理 - 一贱书生的个人空间 - OSCHINA - 中文开源技术交流社区...

    题目描述 按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在字符串 ...

  2. JAVA抽象类接口初始化块实验_抽象类和接口 - 逝水无痕7777的个人空间 - OSCHINA - 中文开源技术交流社区...

    抽象类和接口 1.抽象类 抽象方法是只有方法签名,没有方法实现的方法.有抽象方法的类只能被定义成抽象类,抽象类可以没有抽象方法.抽象方法和抽象类必须使用abstract修饰符来定义. 抽象类不能被实例 ...

  3. php个人空间源码,PHP安装 - 牛牛牛大棚的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.下载php源码包 http://www.php.net/downloads.php 2 .安装php tar -xvf php-5.5.13.tar.bz2 cd php-5.5.13 ./con ...

  4. android宿舍管理系统源码,校园宿舍管理系统 - ATB的个人空间 - OSCHINA - 中文开源技术交流社区...

    本实例为一个校园宿舍管理系统, 系统用户分为三个角色,系统管理员 , 楼宇管理员, 学生, 系统管理员可以应用对楼宇管理员的管理工作(增删改查), 学生的管理(增删改查), 楼宇管理(增删改查), 学 ...

  5. hsf 架构_HSF源码剖析 - 汪兴的个人空间 - OSCHINA - 中文开源技术交流社区

    前言 HSF是一个分布式的远程服务调用框架,其实我更喜欢把分布式几个字去掉,因为HSF本身并不是一个单独的服务(指一个进程),他是附属在你的应用里的一个组件,一个RPC组件(远程过程调用--Remot ...

  6. 获取腾讯视频真实地址php源码,解析腾讯视频真实地址 - osc_hajrc28s的个人空间 - OSCHINA - 中文开源技术交流社区...

    解析腾讯视频真实地址 标签(空格分隔): php 分析 1 我们从腾讯视频上找到的网页链接格式是这样的 https://v.qq.com/x/page/b0136et5ztz.html vid = b ...

  7. 个人空间html源码,HTML常用代码段 - lynn_xiao的个人空间 - OSCHINA - 中文开源技术交流社区...

    base64格式: ------------------------------- ie注释方式: ----------------------------------------------- ie ...

  8. ireader android 源码,仿ireader书架 - androidCode的个人空间 - OSCHINA - 中文开源技术交流社区...

    public class ReaderActivity extends Activity { private ShelfAdapter mAdapter; // 书架列表 private ListVi ...

  9. 京东云宙斯上传单张图片php,单张图片上传源码 - 茄子何的个人空间 - OSCHINA - 中文开源技术交流社区...

    //控制允许上传的图片类型和大小 if ((($_FILES["fctupian"]["type"] == "image/gif") || ...

最新文章

  1. FlashFXP客户端 FTP连接,连接很慢的情况,
  2. AJAX, callback,promise and generator
  3. 前端学习(2262)vue造轮子框架搭建
  4. Unicode-objects must be encoded before hashing
  5. 任正非:5G也不是万能的,发展也需要一个过程
  6. sharepoint2013用场管理员进行文档库的爬网提示没有权限,拒绝的解决方法
  7. @程序员们,华为员工 300 万分红,老板给你多少年终奖?
  8. Want VS Needs,产品经理基于场景的需求挖掘
  9. pom.xml中添加oracle数据库驱动包报错: Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0
  10. mongodb之replSet复制集 + auth
  11. Java 课堂笔记(全)
  12. 重新安装百度网盘,报“您的电脑已安装版本更高的百度网盘客户端”对话框,无法安装
  13. 1.Requests库
  14. php课设报告致谢_科学网—博士论文致谢 - 曹墨源的博文
  15. mixin(公共样式定义)
  16. Python markdown转epub (格式间转换)
  17. ps 导出矢量图为svg,并上传iconfont
  18. Wayland是什么
  19. ENVI:如何对Landsat8影像进行辐射校正?
  20. wpp trace在windbg输出的方法

热门文章

  1. 教务系统—课程表接口信息
  2. intellij idea svn不能更新和提交
  3. matlab fgoalattain,MATLAB多目标优化
  4. 对方波信号进行傅里叶级数展开,利用matlab绘制展开后的波形
  5. 京东API网关实践之路
  6. 看张亚飞《.Net for Flash FMS》的笔记
  7. 计算机操作处于挂起状态,计算机重新启动操作可能处于挂起状态怎么办?
  8. python解压文件中哪个是安装包_python解压文件格式的基本方法
  9. matlab怎么添加注释快捷键,Matlab注释技巧
  10. 2977 二叉堆练习1 codevs