本文為大家分享了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