剑指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;
}
}