- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章java实现链表反转由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文为大家分享了java实现链表反转的具体代码,供大家参考,具体内容如下 。
算法题:实现链表的反转 。
提供了2种方法,迭代法、递归法.
(为了方便输出可视化,在自定义的ListNode中重写了toString方法。) 。
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
|
/**
* Created By --- on 2021/8/12
* 以下代码可以直接粘贴进编译器输出
*/
public
class
ReverseList {
public
static
void
main(String[] args) {
ListNode head =
new
ListNode(
3
,
new
ListNode(
5
,
new
ListNode(
8
,
new
ListNode(
9
))));
System.out.println(
"初始链表:"
+ head);
ListNode newList = reverseList(head);
System.out.println(
"使用迭代法反转链表:"
+ newList);
ListNode newList2 = reverseList2(
null
, newList);
System.out.println(
"使用递归法反转链表:"
+ newList2);
}
/**
* 迭代法
*/
public
static
ListNode reverseList(ListNode head) {
ListNode pre =
null
;
ListNode cur = head;
ListNode tmp;
while
(cur !=
null
) {
tmp = cur.next;
cur.next = pre;
pre = cur;
cur = tmp;
}
return
pre;
}
/**
* 递归法
*/
public
static
ListNode reverseList2(ListNode pre, ListNode cur) {
if
(cur ==
null
) {
return
pre;
}
ListNode tmp = cur.next;
cur.next = pre;
pre = cur;
cur = tmp;
return
reverseList2(pre, cur);
}
}
/**
* singly-linked list
*/
class
ListNode {
int
val;
ListNode next;
ListNode() {
}
ListNode(
int
val) {
this
.val = val;
}
ListNode(
int
val, ListNode next) {
this
.val = val;
this
.next = next;
}
@Override
public
String toString() {
StringBuilder sb =
new
StringBuilder(String.valueOf(val));
ListNode next =
this
.next;
while
(next !=
null
) {
sb.append(next.val);
next = next.next;
}
return
sb.toString();
}
}
|
输出结果:
。
再为大家分享一段java实现链表反转的三种方式 。
分别通过栈、递归、指针的方式实现:
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
|
import
java.util.Stack;
public
class
ReverseLinkedList {
public
static
void
main(String[] args) {
ReverseLinkedList reverseLinkedList =
new
ReverseLinkedList();
reverseLinkedList.test();
}
public
void
test() {
Node node1 =
new
Node(
1
);
Node node2 =
new
Node(
2
);
Node node3 =
new
Node(
3
);
node1.setNext(node2);
node2.setNext(node3);
//方法需要替换
node1 = reverseByPointer(node1);
while
(node1 !=
null
) {
System.out.println(node1.val);
node1 = node1.getNext();
}
}
//栈实现
private
Node reverseByStack(Node head) {
if
(head ==
null
|| head.getNext() ==
null
) {
return
head;
}
Stack<Node> stack =
new
Stack<>();
while
(head !=
null
) {
stack.push(head);
head = head.getNext();
}
head = stack.pop();
Node tmp = head;
while
(!stack.empty()) {
Node node = stack.pop();
node.setNext(
null
);
tmp.setNext(node);
tmp = node;
}
return
head;
}
//递归实现
private
Node reverseByRecursion(Node head) {
if
(head ==
null
|| head.getNext() ==
null
) {
return
head;
}
//递归获取当前节点的后一个节点
Node tmp = reverseByRecursion(head.getNext());
Node node = head.getNext();
head.setNext(
null
);
node.setNext(head);
return
tmp;
}
//指针实现
private
Node reverseByPointer(Node head) {
if
(head ==
null
|| head.getNext() ==
null
) {
return
head;
}
//pre指针指向前一个节点,初始第一个节点的前节点为空
Node pre =
null
;
//tmp指针指向当前节点
Node tmp =
null
;
while
(head !=
null
) {
//tmp指针指向head头指针节点
tmp = head;
//head头指针向后遍历
head = head.getNext();
//反转,设置当前节点的下一个节点为前一个节点
tmp.setNext(pre);
//pre指针向后移动,指向当前节点
pre = tmp;
}
return
tmp;
}
private
class
Node {
private
int
val;
private
Node next;
public
Node(
int
val) {
this
.val = val;
}
public
Node getNext() {
return
next;
}
public
void
setNext(Node next) {
this
.next = next;
}
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/kqZhu/article/details/119719751 。
最后此篇关于java实现链表反转的文章就讲到这里了,如果你想了解更多关于java实现链表反转的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试将我在本文档中阅读的内容付诸实践: https://sar.informatik.hu-berlin.de/research/publications/SAR-PR-2006-05/SAR-
我一直在尝试编写一个可以改变这个的 terraform 表达式: subnets = { my_subnet_1 = { nsg = "my_nsg_1", ad
我有一个HashMap,它将两个字符串转换为单词,然后将单词添加到 map 中。我拥有它,以便一个键可以指向多个值。现在我想创建一个循环来反转表,以便所有值都指向键。不要为一个指向多个逆值的键而烦恼。
我对 ~ 运算符有点困惑。代码如下: a = 1 ~a #-2 b = 15 ~b #-16 ~ 是如何工作的? 我想,~a 会是这样的: 0001 = a 1110 = ~a 为什么不呢? 最佳
如果执行 ResourceManager.GetString(Key),您可以获取资源中某个项目的值。有没有一种方法可以进行反向查找以从给定值的资源中获取 key (本质上是反翻译)? 最佳答案 您应
我在 R 中编写了一个代码来反转一个数字。但是我得到了 inf作为输出。 digit0){ rev_num=rev_num*10 + digit %% 10 digit=digit / 10 }
这个问题已经有答案了: Invert keys and values of the original dictionary (3 个回答) 已关闭 9 年前。 我正在寻找在 python 上转置一本字
所以我试图反转我当前制作的形状的输出。我想知道我应该扭转这种情况吗?我尝试更改变量“a”和“c”的值,最终陷入无限循环。 class IRT { public static void main
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: PHP mysql_real_escape_string() -> stripslashes() leavi
从 Wordpress 模板中提取一些预先存在的代码来绘制椭圆阴影。阴影呈椭圆形向下辐射。只有椭圆的下半部分可见,从而形成底部阴影效果。 我只是想“反转”椭圆的“阴影效果”,以便只有阴影的顶部 一半可
我有一个函数应该找到两个弧度的中间 function mrad(rb,ra){return (rb+ra)/2;} 但有时,当我用 Math.sin 和 Math.cos 绘制 x 和 y 时,这两个
给定此代码(http://jsfiddle.net/bzf1mkx5/) .intern { -webkit-animation: in 1s 1 reverse forwards; } .i
我对 ~ 运算符有点困惑。代码如下: a = 1 ~a #-2 b = 15 ~b #-16 ~ 是如何工作的? 我想,~a 会是这样的: 0001 = a 1110 = ~a 为什么不呢? 最佳
我需要以相反的顺序从列表中提取项目(从最后一个条目到第一个)。我设法得到了所有元素,但是,从第一个到最后一个。这是我正在使用的部分代码: 该列表位于不同的网站集上。 using (SPSit
由于一些证书问题,我不得不写 ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chai
是否有一个函数接受一个函数列表和一个输入,并输出一个对输入进行操作的函数列表? 所以像 map,但倒退: >>>map(lambda x: 2*x,[1,2,3,4,5,6,7,8,9]) [2, 4
考虑下表团队消息: 15:10 | Peter | I'm off to the store, call my mobile phone if you need me. 15:11 | Susy |
算法如下: int encryption(int a, int b) { short int c, c2; uint8_t d; c = a ^ b; c2 = c;
我正在寻找一种方法来逆转 a CRC32 checksum .周围有解决方案,但它们要么是 badly written , extremely technical和/或 in Assembly .汇编
使用批处理文件,处理所有在文件名或扩展名中共享字符串的文件就足够简单了,例如: FOR /R %F IN (*.EXE) DO @ECHO %F 但是,如果我想反转文件集的含义怎么办?比如,处理所有不
我是一名优秀的程序员,十分优秀!