剑指offer 从尾到头遍历链表 详解

本文详细解析了深度优先搜索(DFS)在链表中的应用,包括递归实现的dfs函数,以及如何通过反转链表的方法将链表从尾到头打印。同时介绍了Java代码实例,涉及ArrayList的操作和链表转换技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指offer 从尾到头遍历链表 详解

dfs回顾

dfs
广度优先搜索
对于一个非空节点,我们遍历所有的没有被访问的子节点,然后对于本节点进行操作。

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    void dfs(ListNode* temp,vector<int>& ans){
    if (temp)
    {
    dfs(temp->next,ans);
    ans.push_back(temp->val);
    }
}
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> ans;
        dfs(head,ans);
        return ans;
    }
};

反转链表的实现

reverse函数
#include < algorithm >

例子:
 1.reverse(str.begin(),str.end()) 反转字符串

2.reverse(vector.begin(),vector.end()) 反转向量

3.reverse(a,a+strlen(a)) 反转数组

同理我们还可以反转很多东西

例如二维向量reverse(ans.begin(),ans.end())
这里最后一列就变成了第一列!

 vector<int> ans;
        ListNode* temp=head;
    
        while(temp){
            ans.push_back(temp->val);
           
            temp=temp->next;
        }
        
        reverse(ans.begin(),ans.end());
        
        return ans;

java代码的实现

java的arraylist类的复习
在这里插入图片描述
相比较于c++而言java的list需要初始化,而且java之中不可以有if(node)这样的写法必须是if(node!=null)才行。

arraylist的常用方法
add(index,object)
add(object)
remove(index)
remove(object)
Collections.shuffle(arraylist,rand)

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
//         由于这里必须要返回arraylist所以我们定义的变量是arraylist
        ArrayList<Integer> ans=new ArrayList<Integer>();
        while(listNode!=null){
            ans.add(0,listNode.val);
            listNode=listNode.next;
        }
        Collections.shuffle(ans);
        return ans;
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值