剑指offer---从尾到头打印链表

问题:剑指offer---从尾到头打印链表

要求:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

 1 /**
 2 *  struct ListNode {
 3 *        int val;
 4 *        struct ListNode *next;
 5 *        ListNode(int x) :
 6 *              val(x), next(NULL) {
 7 *        }
 8 *  };
 9 */
10 class Solution {
11 public:
12     vector<int> printListFromTailToHead(ListNode* head) {
13         
14     }
15 };

上一篇博客中已经建立了链表类,基于上述基础进行适当修改即可解决上述问题。

方法一:采用链表类反转链表方法的思想,采用三指针法将链表指针倒序(但是此方法改变了链表的结构);

方法二:先将链表从头到尾遍历,存到堆栈中,利用堆栈后进先出的特点,依次弹出就可。(没有对原链表进行改动,本文采用方法二)。

大部分代码与上篇博客中的链表类相同,只是增加了一个 printListFromTailToHead(ListNode* head) 函数,同时把 class List() 的 Node *head; 改为了 public 

其中 printListFromTailToHead(ListNode* head) 函数如下:

 1 vector<int> printListFromTailToHead(Node* head){
 2     stack<int> temp;
 3     Node *p = head;
 4     while (p != nullptr){
 5         temp.push((*p).data);
 6         p = p->next;
 7     }
 8     vector<int> res;
 9     while (!temp.empty()){
10         res.push_back(temp.top());
11         temp.pop();
12     }
13     return res;
14 }

完整代码

  1 #include<iostream>
  2 #include<vector>
  3 #include<stack>
  4 using namespace std;
  5 
  6 class Node {
  7 public:
  8     int data;
  9     Node *next;
 10     Node(int da):
 11         data(da), next(NULL){}
 12 };
 13 
 14 class List{
 15 public:
 16     Node *head;
 17     List(): head(NULL){}
 18     ~List(){
 19         delete head;
 20         cout<<"The list is deleted."<<endl;
 21     };
 22     int size();
 23     void printList(); // 打印链表
 24     void insert(int position, int value); // 指定位置插入
 25     void insertHead(int value); // 插入到最前
 26     void insertTail(int value); // 插入到最后
 27 };
 28 
 29 // 返回链表大小
 30 int List::size(){
 31     Node *p = head;
 32     int index = 0;
 33     while(p != NULL){
 34         index++;
 35         p = p->next;
 36     }
 37     return index;
 38 }
 39 
 40 // 打印链表
 41 void List::printList(){
 42     Node *p = head;
 43     while(p != NULL){
 44         cout<<p->data<<" ";
 45         p = p->next;
 46     }
 47     cout<<endl;
 48     cout<<endl;
 49 }
 50 
 51 // 在position位置插入value
 52 void List::insert(int position, int value){
 53     if(position<0 || position>List::size()){
 54         cout<<"position error, please check."<<endl;
 55         return ;
 56     }
 57     Node *s = new Node(value); // new node
 58     Node *p = head;
 59     if(head == NULL){ // isEmpty = true
 60         head = s;
 61     }
 62     else{ // isEmpty = false
 63         if(position == 0){
 64             s->next = p;
 65             head = s;
 66         }
 67         else{
 68             int index = 0;
 69             while(index != position-1){
 70                 p = p->next;
 71                 index++;
 72             }
 73             s->next = p->next;
 74             p->next = s;
 75         }
 76     }
 77     if (position == 0)
 78         cout<<"insert "<<value<<" at the first."<<endl;
 79     else if (position == List::size())
 80         cout<<"insert "<<value<<" at the tail."<<endl;
 81     else
 82         cout<<"insert "<<value<<" at position "<<position<<endl;
 83 }
 84 
 85 // 头部插入
 86 void List::insertHead(int value){
 87     List::insert(0, value);
 88 }
 89 
 90 // 尾部插入
 91 void List::insertTail(int value){
 92     List::insert(List::size(), value);
 93 }
 94 
 95 // printListFromTailToHead
 96 vector<int> printListFromTailToHead(Node* head){
 97     stack<int> temp;
 98     Node *p = head;
 99     while (p != nullptr){
100         temp.push((*p).data);
101         p = p->next;
102     }
103     vector<int> res;
104     while (!temp.empty()){
105         res.push_back(temp.top());
106         temp.pop();
107     }
108     return res;
109 }
110 
111 int main() {
112     List l1;
113     l1.insertTail(6);
114     l1.insertHead(7);
115     l1.insert(1, 5);
116     l1.insert(0, 16);
117     l1.insert(2, 56);
118     l1.insert(0, 169);
119     l1.insert(6, 16);
120 
121     vector<int> result;
122     Node *p = l1.head;
123     result = printListFromTailToHead(p);
124     cout<<endl<<"The list is:"<<endl;
125     l1.printList();
126     cout<<"print list from tail to head:"<<endl;
127     for(auto &it : result)
128         cout<<it<<' ';
129     cout<<endl<<endl;
130     return 0;
131 }
View Code

运行结果

 1 insert 6 at the first.
 2 insert 7 at the first.
 3 insert 5 at position 1
 4 insert 16 at the first.
 5 insert 56 at position 2
 6 insert 169 at the first.
 7 insert 16 at position 6
 8 
 9 The list is:
10 169 16 7 56 5 6 16 
11 
12 print list from tail to head:
13 16 6 5 56 7 16 169 
14 
15 The list is deleted.
16 [Finished in 2.6s]

 

posted on 2018-10-11 17:43  wangzhch  阅读(972)  评论(0编辑  收藏  举报

导航