1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
package link.reverse;
// 定义一个单链表 class Node {
//变量
private int record;
//指向下一个对象
private Node nextNode;
public Node( int record) {
this .record = record;
}
public int getRecord() {
return record;
}
public void setRecord( int record) {
this .record = record;
}
public Node getNextNode() {
return nextNode;
}
public void setNextNode(Node nextNode) {
this .nextNode = nextNode;
}
} /** * 两种方式实现单链表的反转(递归、普通)
*/ public class RevSingleLinkFactory {
/**
* 递归,在反转当前节点之前先反转后续节点
*/
//最终传递一个指向最后一个节点的变量
public static Node reverse1(Node head) {
//当为空或者本节点为末尾节点的时候
if (head == null ||head.getNextNode()== null )
return head;
Node reversedHead = reverse1(head.getNextNode());
//获取先前的下一个节点,让该节点指向自身
head.getNextNode().setNextNode(head);
//破坏以前自己指向下一个节点
head.setNextNode( null );
//层层传递给最上面的
return reversedHead;
}
/**
* 遍历,将当前节点的下一个节点缓存后更改当前节点指针
*/
public static Node reverse2(Node head) {
if ( null == head) {
return head;
}
Node pre = head;
Node cur = head.getNextNode();
Node next;
while (cur != null ) {
//断之前先找到原始的下一个节点
next = cur.getNextNode();
//逆序连接
cur.setNextNode(pre);
//两个节点同时滑动
pre = cur;
cur = next;
}
//将原链表的头节点的下一个节点置为null,再将反转后的头节点赋给head
head.setNextNode( null );
head = pre;
return head;
}
public static void main(String[] args) {
//带有头结点
Node head = new Node( 0 );
Node tmp = null ; // 保存临时变量
Node cur = null ; // 始终指向末尾节点
//构造一个长度为10的链表,保存头节点对象head
//利用尾插入法
for ( int i = 1 ; i < 10 ; i++) {
tmp = new Node(i);
if ( 1 == i) {
head.setNextNode(tmp);
} else {
cur.setNextNode(tmp);
}
cur = tmp;
}
//打印反转前的链表
Node h = head;
while (h != null ) {
System.out.print(h.getRecord() + " " );
h = h.getNextNode();
}
//调用反转方法
head = reverse1(head);
System.out.println( "\n*******************" );
//打印反转后的结果
while (head != null ) {
System.out.print(head.getRecord() + " " );
head = head.getNextNode();
}
}
}
|
- 浏览: 40740 次
- 性别:
- 来自: 北京
最新评论
发表评论
-
java-多线程005
2014-08-04 14:35 627Java线程:线程的同步与锁 一、同步问 ... -
java-多线程004
2014-08-04 14:16 639Java线程:线程状态的 ... -
java-多线程003
2014-08-04 14:02 613Java线程:线程栈模型与线程的变量 要理解线程调度 ... -
java-多线程002
2014-08-04 13:59 700Java线程:创建与启动 SCJP5学习笔记 ... -
java-多线程001
2014-08-04 13:53 673一、操作系统中线程和进程的概念 现在的操作系统是多任务 ... -
java序列化
2014-04-24 13:10 583Java序列化的机制和原 ... -
java 幂等性
2014-02-27 17:10 3461幂等性 个人理解及应用 [原创链接: http:// ... -
java 幂等性
2014-02-27 17:08 940基于HTTP协议的Web API是时下最为流行的一种分布式服 ... -
jvm
2014-02-25 21:30 675一、相关概念 基本回收算法 引用计数(Referen ... -
jvm性能调优都做了什么
2014-02-25 11:21 1172JVM性能调优有很多设置,这个参考JVM参数即可. 主要调 ... -
性能优化
2014-02-25 10:52 903业务数据库 -》 数据水平分割(分区分表分库)、读写分离业务应 ... -
java 设计模式--中介者模式
2014-02-18 18:00 718中介者的功能非常简单,就是封装对象之间的交互。 如果一个对 ... -
java 设计模式--迭代器模式
2014-02-18 17:52 713定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对 ... -
freemarker
2014-02-18 12:19 708FreeMarker的模板文件并不 ... -
java IO 总结
2014-02-12 16:15 535写在前面:本文章基本 ... -
java 设计模式--命令模式
2014-01-13 14:25 754在程序设计中,经常设 ... -
java 设计模式--责任链模式
2014-01-13 12:17 622在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链( ... -
java 设计模式--享元模式
2014-01-13 11:38 588GOF:运用共享技术有效地支持大量细粒度的对象。 解释一 ... -
java 设计模式--外观模式
2014-01-13 11:31 5181.应用程序可能用到的一些接口,分别列出如下: 1.1: ... -
java 设计模式--装饰模式
2014-01-10 15:25 631在阎宏博士的《JAVA与模式》一书中开头是这样描述装饰(De ...
相关推荐
- **题目**:实现在单链表中替换节点的操作。 - **解答**:定位到待替换节点的位置,并更新其值。 **习2.6:实验2.2首尾相接地连接两条单链表** - **题目**:连接两个单链表。 - **解答**:找到第一个链表的尾节点...
第0章 Java程序设计基础 1 【习0.1】 实验0.1 哥德巴赫猜想。 1 【习0.2】 实验0.2 杨辉三角形。 1 【习0.3】 实验0.3 金额的中文大写形式。 1 【习0.4】 实验0.4 下标和相等的数字方阵。 1 【习0.5】 实验0.5 找出...
数组和广义表是数据结构中两种常用的数据结构,本章节提供了数组和广义表的相关习题,包括求一个矩阵的转置矩阵等。 第6章 树和二叉树 树和二叉树是数据结构中两种重要的非线性结构,本章节提供了树和二叉树的相关...
要求学生根据指定的题目要求,使用Java编程语言实现数据结构的具体应用。 2. 线性表的表示与运算: - 排序单链表存储多项式的相关操作,包括多项式的相加与相乘。 - 排序循环双链表存储多项式的相关操作,同样是...
在课程设计中,学生需要实现稀疏矩阵的压缩存储,并且进行矩阵的基本运算,如矩阵的相加和转置。这一部分不仅考验学生的编程能力,还要求他们能够在数据存储和处理方面有更深层次的理解。 通过这些设计题目,学生将...
在编程语言中,链式队列的实现通常涉及到指针或者引用的概念,例如在C++、C#、Java等面向对象的语言中,可以定义一个节点类(Node)和一个队列类(Queue)。队列类包含对头节点和尾节点的引用,以及相关的操作方法。...
B树的删除.rar B树的生长过程.rar 三元组表的转置.rar 中序线索化二叉树.rar 串的顺序存储.rar 二分查找.rar 二叉排序树的删除.rar 二叉排序树的生成.rar 二叉树的建立.rar 克鲁斯卡尔...
4. **矩阵代数**:矩阵的加法、乘法、转置、逆矩阵、行列式、秩和特征值等计算。 通过这个系统,用户可以进行以下活动: - 实时编程和调试:编写代码实现数据结构或代数系统,系统会提供反馈和错误检查。 - 测试和...
- **单链表实现**:介绍单链表的基本操作,如插入、删除、查找等。 - **双向链表实现**:双向链表除了包含指向下一个节点的指针外,还包含一个指向前一个节点的指针。 - **删除链表中的结点**:在不给定头结点的...
- 链表的基本概念:单链表、双链表、循环链表等。 - 链表的操作:插入、删除、查找等。 - 特殊链表的应用:如跳跃表、哈希链表等。 - 实际应用场景:例如在实现 LRU 缓存算法、文本编辑器等功能时。 ##### 低级...