单链表的逆置java
时间: 2025-01-06 08:44:42 浏览: 49
### 单链表逆置的Java实现
#### 方法一:迭代方法
通过遍历整个列表并逐个调整节点指向来完成链表反转。此过程涉及三个指针变量用于追踪当前处理位置及其前后节点。
```java
public class LinkedList {
static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public static ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next; // Store reference to the rest of list.
curr.next = prev; // Reverse link direction.
prev = curr; // Move `prev` one step forward.
curr = nextTemp; // Move `curr` one step forward.
}
return prev; // New head is last non-null node visited by `prev`.
}
}
```
这种方法的时间复杂度为 O(n),其中 n 是链表长度,因为只需一次线性扫描即可完成操作[^1]。
#### 方法二:递归方式
利用函数调用栈自然形成的回溯机制,在返回过程中逐步建立新的链接关系从而达到翻转效果。需要注意的是当输入为空或仅含单一元素时应直接返回原样不变。
```java
class Solution {
private ListNode newHead;
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null){
return head;
}
helper(null, head);
return newHead;
}
private void helper(ListNode pre, ListNode cur){
if(cur==null)return ;
if(cur.next==null)newHead=cur;//记录最后一个节点作为新头结点
helper(cur, cur.next);
cur.next = pre; // Change pointer direction during backtracking phase.
}
}
```
上述两种方案均能有效解决单链表逆转问题,具体选用哪一种取决于实际应用场景和个人偏好。对于大多数情况而言,迭代版本可能更易于理解和调试;而递归则提供了更为简洁优雅的形式[^3]。
阅读全文
相关推荐

















