节点类如下:
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
反转单向链表的方法如下:
public ListNode ReverseList(ListNode head) {
ListNode pre = null;
ListNode next = null;
while (head != null) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
现在有一个单向链表如下图所示:

反转后如下所示:

第一步:next = head.next
将 head.next 赋值给 next 变量,也就是说 next 指向了节点2,先将节点2 保存起来。

第二步:head.next = pre
将 pre 变量赋值给 head.next,即 节点1 指向了 null

第三步:pre = head
将 head 赋值给了 pre,即 pre 指向节点1,将节点1 设为“上一个节点”

第四步:head = next
将 next 赋值给 head,即 head 指向了节点2。将节点2 设为“头节点”

第一次循环完毕,进入第二次循环。
第一步:next = head.next
将 head.next 赋值给 next 变量,也就是 next 指向了节点3,先将节点3 保存起来。

第二步:head.next = pre
将 pre 赋值给 head.next,pre 在上一次循环的时候指向了节点1,那么这一步的意义就是节点2 指向了 节点1,完成一次反转

第三步:pre = head
将 head 赋值给了 pre,即 pre 指向节点2,将节点2 设为“上一个节点”

第四步:head = next
将 next 赋值给 head,即 head 指向了节点3。将节点3 设为“头节点”

第二次循环完毕,以此类推!第三次第四次第五次循环。最后反转成如下图

参考:https://blog.youkuaiyun.com/xyh269/article/details/70238501
本文详细解析了单向链表的反转算法实现过程,通过四个步骤循环进行节点的重新链接,最终达到链表反转的目的。算法核心在于利用三个指针(pre、head、next)来保存和更新链表节点的连接关系。
325

被折叠的 条评论
为什么被折叠?



