2025年- G19-Lc93-206.反向链接链表-java版
1.题目描述
2.思路
思路一:
链表是一个典型的链表操作,通常可以通过迭代或递归来完成,而不是通过排序。
思路二:
在链表反转的过程中,prev 代表的是当前节点的前一个节点。它是一个用来帮助我们反转链表指针的辅助指针。
(1)prev 是用于存储当前节点的前一个节点,反转过程中不断向前移动。
(2)每一步,curr 节点的 next 指针都指向了 prev,反转了链表的方向。
(3)最终,prev 会指向新的头节点,即链表反转后的头节点。
3.java代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
// 1.递归终止条件:当前节点为 null 或当前节点为最后一个节点
{
if(head==null||head.next==null)
{
return;
}
// 2.递归反转链表的剩余部分
ListNode newhead=reverseList(head.next);
head.next.next=head;// 反转当前节点
head.next=null;// 当前节点的 next 置为 null
return newHead; // 返回反转后的头节点
}
}
}
方法二:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
// // 1.递归终止条件:当前节点为 null 或当前节点为最后一个节点
// {
// if(head==null||head.next==null)
// {
// return head;
// }
// // 2.递归反转链表的剩余部分
// ListNode newhead=reverseList(head.next);
// head.next.next=head;// 反转当前节点
// head.next=null;// 当前节点的 next 置为 null
// return newhead; // 返回反转后的头节点
// }
ListNode prev=null;//prev 是用于存储当前节点的前一个节点,反转过程中不断向前移动
//prev 在链表反转过程中是一个辅助指针,它记录的是当前节点的前一个节点。
//每一步,curr 节点的 next 指针都指向了 prev,反转了链表的方向。
//最终,prev 会指向新的头节点,即链表反转后的头节点。
ListNode current=head;// curr 从 head 开始
while(current!=null)
{
ListNode temp=current.next;// 保存当前节点的下一个节点
current.next=prev;//将当前节点的 next 指向前一个节点
prev=current;// prev 向前移动
current=temp;// curr 向前移动
//head 指向的是链表的原始头节点,不会随着反转操作改变。
//curr 是链表反转过程中动态变化的指针,表示当前正在操作的节点,因此循环条件是 curr != null,直到遍历完整个链表。
}
// prev 是反转后的头节点
return prev;
}
}