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->请按任意键继续. . .
在代码的世界尽情的翱翔吧!