import java.util.Stack; public class Solution { public ListNode ReverseList(ListNode head) { Stack<ListNode> stack= new Stack<>(); //把链表节点全部摘掉放到栈中 while (head != null) { stack.push(head); head = head.next; } if (stack.isEmpty()) return null; ListNode node = stack.pop(); ListNode dummy = node; //栈中的结点全部出栈,然后重新连成一个新的链表 while (!stack.isEmpty()) { ListNode tempNode = stack.pop(); node.next = tempNode; node = node.next; } //最后一个结点就是反转前的头结点,一定要让他的next //等于空,否则会构成环 node.next = null; return dummy; } }
时间: 2024-04-11 09:25:57 浏览: 9
这段代码是一个用于反转链表的方法。让我来解释一下代码的逻辑:
首先,代码创建了一个名为 `stack` 的栈,用于存储链表节点。
```java
Stack<ListNode> stack = new Stack<>();
```
接下来,代码使用一个循环遍历链表,并将每个节点压入栈中。
```java
while (head != null) {
stack.push(head);
head = head.next;
}
```
然后,代码检查栈是否为空。如果栈为空,说明链表中没有节点,那么返回 `null`。
```java
if (stack.isEmpty())
return null;
```
接着,代码从栈中弹出一个节点,并将它赋值给 `node` 变量。
```java
ListNode node = stack.pop();
```
然后,代码将 `node` 赋值给 `dummy` 变量。
```java
ListNode dummy = node;
```
接下来,代码使用另一个循环从栈中弹出节点,并将它们重新连接成一个新的链表。
```java
while (!stack.isEmpty()) {
ListNode tempNode = stack.pop();
node.next = tempNode;
node = node.next;
}
```
最后,代码将最后一个节点的 `next` 设置为 `null`,以避免形成循环,并返回反转后的链表的头节点 `dummy`。
```java
node.next = null;
return dummy;
```
这段代码的作用是将原始链表逆序,并返回逆序后的新链表的头节点。