java链表源码_JAVA之链表源码 - 飞翔的南极企鹅的个人空间 - OSCHINA - 中文开源技术交流社区...
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 - 中文开源技术交流社区...相关推荐
- java把abcedf字符串进行排序_字符串合并处理 - 一贱书生的个人空间 - OSCHINA - 中文开源技术交流社区...
题目描述 按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在字符串 ...
- JAVA抽象类接口初始化块实验_抽象类和接口 - 逝水无痕7777的个人空间 - OSCHINA - 中文开源技术交流社区...
抽象类和接口 1.抽象类 抽象方法是只有方法签名,没有方法实现的方法.有抽象方法的类只能被定义成抽象类,抽象类可以没有抽象方法.抽象方法和抽象类必须使用abstract修饰符来定义. 抽象类不能被实例 ...
- 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 ...
- android宿舍管理系统源码,校园宿舍管理系统 - ATB的个人空间 - OSCHINA - 中文开源技术交流社区...
本实例为一个校园宿舍管理系统, 系统用户分为三个角色,系统管理员 , 楼宇管理员, 学生, 系统管理员可以应用对楼宇管理员的管理工作(增删改查), 学生的管理(增删改查), 楼宇管理(增删改查), 学 ...
- hsf 架构_HSF源码剖析 - 汪兴的个人空间 - OSCHINA - 中文开源技术交流社区
前言 HSF是一个分布式的远程服务调用框架,其实我更喜欢把分布式几个字去掉,因为HSF本身并不是一个单独的服务(指一个进程),他是附属在你的应用里的一个组件,一个RPC组件(远程过程调用--Remot ...
- 获取腾讯视频真实地址php源码,解析腾讯视频真实地址 - osc_hajrc28s的个人空间 - OSCHINA - 中文开源技术交流社区...
解析腾讯视频真实地址 标签(空格分隔): php 分析 1 我们从腾讯视频上找到的网页链接格式是这样的 https://v.qq.com/x/page/b0136et5ztz.html vid = b ...
- 个人空间html源码,HTML常用代码段 - lynn_xiao的个人空间 - OSCHINA - 中文开源技术交流社区...
base64格式: ------------------------------- ie注释方式: ----------------------------------------------- ie ...
- ireader android 源码,仿ireader书架 - androidCode的个人空间 - OSCHINA - 中文开源技术交流社区...
public class ReaderActivity extends Activity { private ShelfAdapter mAdapter; // 书架列表 private ListVi ...
- 京东云宙斯上传单张图片php,单张图片上传源码 - 茄子何的个人空间 - OSCHINA - 中文开源技术交流社区...
//控制允许上传的图片类型和大小 if ((($_FILES["fctupian"]["type"] == "image/gif") || ...
最新文章
- FlashFXP客户端 FTP连接,连接很慢的情况,
- AJAX, callback,promise and generator
- 前端学习(2262)vue造轮子框架搭建
- Unicode-objects must be encoded before hashing
- 任正非:5G也不是万能的,发展也需要一个过程
- sharepoint2013用场管理员进行文档库的爬网提示没有权限,拒绝的解决方法
- @程序员们,华为员工 300 万分红,老板给你多少年终奖?
- Want VS Needs,产品经理基于场景的需求挖掘
- pom.xml中添加oracle数据库驱动包报错: Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0
- mongodb之replSet复制集 + auth
- Java 课堂笔记(全)
- 重新安装百度网盘,报“您的电脑已安装版本更高的百度网盘客户端”对话框,无法安装
- 1.Requests库
- php课设报告致谢_科学网—博士论文致谢 - 曹墨源的博文
- mixin(公共样式定义)
- Python markdown转epub (格式间转换)
- ps 导出矢量图为svg,并上传iconfont
- Wayland是什么
- ENVI:如何对Landsat8影像进行辐射校正?
- wpp trace在windbg输出的方法