1104 [填空题]链表的倒序
时间: 2025-01-11 17:13:51 浏览: 31
### 实现链表倒序操作
对于单向链表的反转,存在两种主要的方法:循环方式和递归方式。
#### 循环方式实现链表反转
通过迭代遍历链表中的每一个节点,在遍历时改变当前节点指针的方向。具体来说,需要三个辅助变量分别保存前驱节点、当前节点以及后继节点的信息。随着遍历过程推进,这三个变量不断更新直到完成整个列表的反转[^1]。
```java
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public static ListNode reverseLinkedList(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 'current' one step forward.
}
return prev; // New head is last non-null node visited by 'prev'.
}
```
此代码片段展示了如何利用循环机制逐步调整各节点之间的连接关系从而达到反转的效果。当`curr`为空时说明已经到达原始链表末端,则此时`prev`所指向的就是新的头部位置。
#### 递归方式实现链表反转
另一种方法是采用递归来处理这个问题。这种方法的核心在于假设除了第一个元素外其他部分已经被成功翻转的情况下该如何构建最终的结果。因此函数会一直深入到最底层即遇到null为止返回,并在此基础上逐层建立反向链接直至回到起点。
```java
private static ListNode recursiveReverseHelper(ListNode current,ListNode previous){
if(current==null){ // Base case: end reached.
return previous; // Return new head after reversal.
}else{
ListNode tempNext=current.next;// Save pointer to remaining part.
current.next=previous; // Point backwards at each level up stack.
return recursiveReverseHelper(tempNext,current); // Recurse deeper into unprocessed nodes.
}
}
// Wrapper method for cleaner interface without exposing internal parameters.
public static ListNode reverseListRecursively(ListNode head){
return recursiveReverseHelper(head,null);
}
```
上述两段Java程序分别代表了不同的解决方案来解决相同的问题——使给定顺序存储的数据项按照相反次序排列起来形成一个新的线性序列。
阅读全文
相关推荐








