03 从尾到头打印链表结点

  1 //请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
  2 //---------------------------------------------
  3 //思路:已知字符串,需要求出替换后的字符串,则需要新建一个字符串数组,或者将原有的字符串扩充;
  4 
  5 #include <iostream>
  6 #include<vector>
  7 using namespace std;
  8 //链表的结点
  9 //struct ListNode
 10 //{
 11 //    int val;
 12 //    struct ListNode* next;
 13 //    ListNode(int x) : val(x), next(NULL) {};
 14 //};
 15 struct ListNode
 16 {
 17     int m_nValue;
 18     ListNode* m_pNext;
 19 };
 20 //创建链表的结点
 21 ListNode* CreateListNode(int value)
 22 {
 23     ListNode* pNode = new ListNode();
 24     pNode->m_nValue = value;
 25     pNode->m_pNext = NULL;
 26     return pNode;
 27 }
 28 
 29 //往链表尾部插入结点
 30 void AddToTail(ListNode** pHead, int value)
 31 {
 32     ListNode* pNew = new ListNode();//新插入的结点
 33     pNew->m_nValue = value;
 34     pNew->m_pNext = NULL;
 35 
 36     if (*pHead == NULL)//空链表
 37     {
 38         *pHead = pNew;
 39     }
 40     else
 41     {
 42         ListNode* pNode = *pHead;
 43         while (pNode->m_pNext != NULL)
 44             pNode = pNode->m_pNext;
 45         pNode->m_pNext = pNew;
 46     }
 47 
 48 }
 49 //遍历链表中的所有结点
 50 void PrintList(ListNode* pHead)
 51 {
 52     ListNode *pNode = pHead;
 53     while (pNode != NULL)
 54     {
 55         cout << pNode->m_nValue << " ";
 56         pNode = pNode->m_pNext;
 57     }
 58     cout << endl;
 59 }
 60 //反转链表
 61 ListNode* ReverseList(ListNode* pHead)
 62 {
 63     if (pHead == NULL)
 64     {
 65         return NULL;
 66     }
 67     ListNode* pNodePre = NULL;
 68     ListNode* pNodeRear = NULL;
 69     //对链表遍历,备份头结点
 70     ListNode* pNode = pHead;
 71     while (pNode != NULL)
 72     {
 73         ListNode* pNext = pNode->m_pNext;
 74         if (pNext == NULL)
 75         {
 76             pNodeRear = pNode;
 77         }
 78         pNode->m_pNext = pNodePre;
 79         pNodePre = pNode;
 80         pNode = pNext;
 81     }
 82     return pNodeRear;
 83 }
 84 //合并链表
 85 ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
 86 {
 87     if (pHead1 == NULL || pHead2 == NULL)
 88     {
 89         return NULL;
 90     }
 91     ListNode* pMergerHead = NULL;
 92     //遍历链表,就要先备份链表结点
 93     ListNode* tmpNode1 = pHead1;
 94     ListNode* tmpNode2 = pHead2;
 95     if (tmpNode1->m_nValue < tmpNode2->m_nValue)
 96     {
 97         pMergerHead = tmpNode1;
 98         pMergerHead->m_pNext = Merge(tmpNode1->m_pNext, tmpNode2);
 99     }
100     else
101     {
102         pMergerHead = tmpNode2;
103         pMergerHead->m_pNext = Merge(tmpNode1, tmpNode2->m_pNext);
104     }
105     return pMergerHead;
106 }
107 class Solution1
108 {
109 public:
110     vector<int> printListFromTailToHead(ListNode* head)
111     {
112         vector<int> tmpVec;
113         if (head == NULL)
114         {
115             return {};
116         }
117         //对链表遍历,首先要对头结点进行备份;
118         ListNode* tmpNode = head;
119         while (tmpNode != NULL)
120         {
121             tmpVec.push_back(tmpNode->m_nValue);
122             tmpNode = tmpNode->m_pNext;
123         }
124         //vector容器有reverse操作
125         reverse(tmpVec.begin(), tmpVec.end());
126         return tmpVec;
127     }
128 };
129 
130 int main()
131 {
132     ListNode* pNode1 = CreateListNode(1);//创建一个结点
133     AddToTail(&pNode1, 2);//为链表添加一个结点
134     AddToTail(&pNode1, 3);//为链表添加一个结点
135     AddToTail(&pNode1, 4);//为链表添加一个结点
136     AddToTail(&pNode1, 5);//为链表添加一个结点
137     AddToTail(&pNode1, 6);//为链表添加一个结点
138     AddToTail(&pNode1, 7);//为链表添加一个结点
139     Solution1 s1;
140     vector<int> result;
141     PrintList(pNode1);
142     result = s1.printListFromTailToHead(pNode1);
143     for (int i = 0; i < result.size(); i++)
144     {
145         cout << result[i] << "->";
146     }
147     system("pause");
148     return 0;
149 }
1 2 3 4 5 6 7
7->6->5->4->3->2->1->请按任意键继续. . .
验证结果

 

posted @ 2017-08-17 12:32  繁星的夜空2012  阅读(124)  评论(0编辑  收藏  举报