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 置为 nullreturn 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;}
}