以下是Java单链表反转的完整攻略:
- 了解反转单链表的基本原理
反转单链表是指将一个单链表中的所有节点顺序反转,即原链表的尾节点变为反转后链表的头节点,原链表的头节点变为反转后链表的尾节点。
为了实现这个过程,我们需要先将原链表的头节点指向null,然后将原链表中第一个节点的next指向null,之后遍历整个原链表,将每个节点的next指向其前一个节点,最后将反转后的链表的头节点指向原链表的尾节点。
- 编写Java代码实现单链表反转
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
在这段代码中,我们首先定义了两个节点变量prev和curr,它们分别代表前一个节点和当前节点。
然后我们进入了一个循环中,循环的条件是当前节点不为空。在循环中,我们首先将当前节点的下一个节点保存到一个临时变量nextTemp中,然后将当前节点的next指向前一个节点pre,然后将pre指向当前节点curr,再将curr指向nextTemp。
这个过程中,我们实际上是不断地将当前节点的位置向前移动一位,并且将每个节点的next指针反转指向前一个节点,最终实现整个单链表的反转。
- 实践示例
下面我们来通过两个实践示例来加深对单链表反转的理解。
示例1:
假设我们有一个单链表1 -> 2 -> 3 -> 4 -> null,我们希望将它反转成4 -> 3 -> 2 -> 1 -> null。
首先我们定义一个链表节点类:
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
然后我们创建一个新的链表,并将节点1、2、3、4加入到链表中:
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
最后,我们调用reverseList方法来反转链表,将操作前后的链表打印出来:
// 反转前的链表
System.out.print("before: ");
ListNode node = head;
while (node != null) {
System.out.print(node.val + " ");
node = node.next;
}
System.out.println();
// 调用reverseList方法反转链表
head = reverseList(head);
// 反转后的链表
System.out.print("after: ");
node = head;
while (node != null) {
System.out.print(node.val + " ");
node = node.next;
}
System.out.println();
输出结果为:
before: 1 2 3 4
after: 4 3 2 1
可以看到,链表已经成功被反转了。
示例2:
假设我们有一个单链表5 -> 6 -> 7 -> 8 -> null,我们希望将它反转成8 -> 7 -> 6 -> 5 -> null。
我们按照上述过程定义链表节点类、创建链表、调用reverseList方法并打印结果,具体代码如下:
ListNode head = new ListNode(5);
head.next = new ListNode(6);
head.next.next = new ListNode(7);
head.next.next.next = new ListNode(8);
System.out.print("before: ");
ListNode node = head;
while (node != null) {
System.out.print(node.val + " ");
node = node.next;
}
System.out.println();
head = reverseList(head);
System.out.print("after: ");
node = head;
while (node != null) {
System.out.print(node.val + " ");
node = node.next;
}
System.out.println();
输出结果为:
before: 5 6 7 8
after: 8 7 6 5
同样可以看到,链表已经成功被反转了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java单链表反转图文教程 - Python技术站