# 06. 从尾到头打印链表
目录
- # 06. 从尾到头打印链表
- 题目
- 代码(双指针法)
- 代码逻辑
- 递归法
- 代码设计流程
题目
官方地址
代码(双指针法)
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/
class Solution {public int[] reversePrint(ListNode head) {ListNode pre = null;ListNode cur = head;ListNode temp = null;int length = 0;// 确定链表的长度while (cur != null) {temp = cur.next;cur.next = pre;pre = cur;cur = temp;length++;}// 创建数组并存储翻转后的链表节点值int[] result = new int[length];int index = 0;while (pre != null) {result[index] = pre.val;pre = pre.next;index++;}return result;}
}
代码逻辑
- 首先,定义了一个单链表的节点类
ListNode
,包含一个整数值val
和一个指向下一个节点的指针next
。 reversePrint
函数接受一个头节点head
,表示待翻转的链表,并返回一个整数数组。- 创建了三个指针变量
pre
、cur
和temp
,初始时pre
和temp
都为null
,cur
指向头节点head
。这三个指针变量用于翻转链表的操作。 - 使用
while
循环遍历链表,直到当前节点cur
为null
。在每次循环中,先将cur
的下一个节点保存到temp
中,然后将cur
的next
指针指向pre
,实现了当前节点的翻转。接着,将pre
指针指向当前节点cur
,cur
指针指向下一个节点temp
,继续循环。 - 循环结束后,链表中的节点已完成翻转,
pre
指向翻转后的新头节点,而cur
为null
。 - 接下来,根据链表的长度创建一个数组
result
,其长度为链表的长度length
。 - 使用另一个指针
index
来遍历数组,初始值为 0。利用while
循环,将翻转后的链表节点的值依次存储到数组中,同时将pre
指针后移一位,直到pre
为null
。 - 最后,返回存储了翻转后链表节点值的数组
result
。
递归法
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/
class Solution {public int length=0;public int[] reversePrint(ListNode head) {ListNode result = reverse(null, head);int ret[]=new int[length];int index=0;while(result!=null){ret[index]=result.val;result=result.next;index++;}return ret;} private ListNode reverse(ListNode pre,ListNode cur){if(cur==null){return pre;}ListNode tmp=null;tmp=cur.next;// 先保存下一个节点cur.next=pre;// 反转length++;// 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步// pre = cur;// cur = temp;return reverse(cur,tmp);}}
代码设计流程
- 定义了一个私有属性
length
,用于记录链表的长度。 reversePrint
方法接受一个链表的头节点head作为参数,并返回一个整型数组。- 在
reversePrint
方法中,通过调用reverse方法将链表进行反转,将反转后的结果赋值给result。 - 创建一个长度为
length
的整型数组ret
,用于存储反转后的节点值。 - 使用index变量作为索引,遍历result链表,将节点值依次存入ret数组中。
- 返回ret数组作为方法的输出。
reverse
方法是一个私有方法,用于实现链表的反转操作。- reverse方法接受两个参数:pre代表当前节点的前一个节点,cur代表当前节点。
- 如果
cur
为null,说明已经遍历到链表末尾,直接返回pre作为反转后的链表头。 - 在
reverse
方法中,创建一个临时变量tmp
,用于保存当前节点的下一个节点。 - 将当前节点的下一个节点指向
pre
,完成反转操作。 - 增加
length
的值,表示链表长度增加1。 - 递归调用
reverse
方法,将当前节点cur的下一个节点tmp
作为新的当前节点,pre
作为新的当前节点的前一个节点。 - 返回递归调用的结果,即反转后的链表头。
这段代码的功能是将给定链表进行反转,并将反转后的节点值存入一个数组中返回。