题目
剑指 Offer 06. 从尾到头打印链表 这道题和著名的剑指 Offer 24. 反转链表的题很像,只不过这道题比反转链表的多了一个操作:即打印出链表的值;而反转链表的就单单的反转就行。
实现思路
1.递归思路极其代码实现
思路:
- 设计一个函数:递归反转链表先,然后调整递归的代码;
- 然后把链表的值插入到数组;
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
vector<int> v;
ListNode* newHead = reverse(head);
ListNode* cur =newHead;
while(cur !=NULL){
v.push_back(cur->val);
cur = cur->next;
}
return v;
}
private:
ListNode* reverse(ListNode* head){
if(head == NULL || head->next == NULL){
return head;
}
ListNode* newHead = reverse(head->next);
head->next->next = head;
head->next = NULL;
return newHead;
}
};
2.头插法实现思路及其实现代码
思路:
- 头插时候,先处理要头插数据的下一个结点,所以要保存将要头插结点的指针定义一个临时指针temp = head->next; 于此同时定义一个新指针 newHead = NULL;
- 处理将要头插的数据:即head = newHead;
- 处理头插前面的结点:newHead ->next = head;
- 处理结束后:旧头结点继续往前移动 head = temp;
- 开始插入数据入数组!
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
vector<int> v;
ListNode* newHead = reverse(head);
ListNode* cur =newHead;
while(cur !=NULL){
v.push_back(cur->val);
cur = cur->next;
}
return v;
}
private:
ListNode* reverse(ListNode* head){
if(head == NULL || head->next == NULL){
return head;
}
ListNode* newHead = NULL;
while(head !=NULL){
ListNode* temp = head->next;
head->next = newHead;
newHead = head;
head = temp;
}
return newHead;
}
};
3.栈模拟思路及其代码实现
思路: 由于栈的先进后出和这里的从尾打印链表刚好吻合,所以可以用栈来完成。
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
stack<int> stk;
vector<int> v;
while(head != NULL){
stk.push(head->val);
head = head->next;
}
while(!stk.empty()){
v.push_back(stk.top());
stk.pop();
}
return v;
}
};
|