参考博客:数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现

              单向链表逆序

一、单链表

单链表结构如下图:

单链表、双链表及单链表的逆序

本文中,head节点也是包含数据的,并且最后一个节点指向的指针为NULL。

下图为单链表的删除操作:

单链表、双链表及单链表的逆序

下图为单链表的插入操作:

单链表、双链表及单链表的逆序

单链表的实现代码如下:

  1 #ifndef SINGLE_LINK_H
  2 #define SINGLE_LINK_H
  3 
  4 #include <iostream>
  5 using namespace std;
  6 
  7 template<class T>
  8 struct SNode
  9 {
 10 public:
 11     T data;
 12     SNode *next;
 13     SNode(){}
 14     SNode(T data, SNode *next)
 15     {
 16         this->data = data;
 17         this->next = next;
 18     }
 19 };
 20 
 21 template<class T>
 22 class SingleLink
 23 {
 24     public:
 25         SingleLink();
 26         ~SingleLink();
 27 
 28         SNode<T> *getHeadNode();
 29         void setHeadNode(SNode<T> *head);
 30         int getSize();
 31         bool isEmpty();
 32         T get(int index);
 33         T getFirst();
 34         T getLast();
 35         void insert(int index, T t);
 36         void insertFirst(T t);
 37         void appendLast(T t);
 38         void del(int index);
 39         void deleteFirst();
 40         void deleteLast();
 41 
 42     private:
 43         int count;
 44         SNode<T> *pHead;
 45         SNode<T> *getNode(int index);
 46 };
 47 
 48 template<class T>
 49 SingleLink<T>::SingleLink() : count(0)
 50 {
 51     pHead = new SNode<T>();
 52     pHead->next = NULL;
 53 }
 54 
 55 template<class T>
 56 SingleLink<T>::~SingleLink()
 57 {
 58     SNode<T> *ptmp;
 59     while(pHead->next != NULL)
 60     {
 61         ptmp = pHead;
 62         pHead = pHead->next;
 63         delete ptmp;
 64     }
 65 
 66     delete pHead;
 67     pHead = NULL;
 68 }
 69 
 70 template<class T>
 71 int SingleLink<T>::getSize()
 72 {
 73     return count;
 74 }
 75 
 76 template<class T>
 77 bool SingleLink<T>::isEmpty()
 78 {
 79     return count == 0;
 80 }
 81 
 82 template<class T>
 83 SNode<T> *SingleLink<T>::getNode(int index)
 84 {
 85     if(index < 0 || index >= count)
 86     {
 87         cout << "Get node failed! The index in out of bound!" << endl;
 88         return NULL;
 89     }
 90 
 91     SNode<T> *pindex = pHead;
 92     int i = 0;
 93     while(i++ < index)
 94     {
 95         pindex = pindex->next;
 96     }
 97 
 98     return pindex;
 99 }
100 
101 template<class T>
102 SNode<T> *SingleLink<T>::getHeadNode()
103 {
104     return getNode(0);
105 }
106 
107 template<class T>
108 void SingleLink<T>::setHeadNode(SNode<T> *head)
109 {
110     this->pHead = head;
111 }
112 
113 template<class T>
114 T SingleLink<T>::get(int index)
115 {
116     return getNode(index)->data;
117 }
118 
119 template<class T>
120 T SingleLink<T>::getFirst()
121 {
122     return getNode(0)->data;
123 }
124 
125 template<class T>
126 T SingleLink<T>::getLast()
127 {
128     return getNode(count - 1)->data;
129 }
130 
131 template<class T>
132 void SingleLink<T>::insert(int index, T t)
133 {
134     SNode<T> *pnode;
135 
136     if(index == 0)
137     {
138         insertFirst(t);
139     }
140     else if(index == count)
141     {
142         appendLast(t);
143     }
144     else
145     {
146         SNode<T> *pindex = getNode(index - 1);
147         pnode = new SNode<T>(t, pindex->next);
148         pnode->data = t;
149         pindex->next = pnode;
150         count++;
151     }
152 }
153 
154 template<class T>
155 void SingleLink<T>::insertFirst(T t)
156 {
157     if(count == 0)
158     {
159         pHead->data = t;
160     }
161     else
162     {
163         SNode<T> *pnode = new SNode<T>(t, pHead);
164         pHead = pnode;
165     }
166     count++;
167 }
168 
169 template<class T>
170 void SingleLink<T>::appendLast(T t)
171 {
172     SNode<T> *pindex = getNode(count - 1);
173     SNode<T> *pnode = new SNode<T>();
174     pindex->next = pnode;
175     pnode->data = t;
176     pnode->next = NULL;
177     count++;
178 }
179 
180 template<class T>
181 void SingleLink<T>::del(int index)
182 {
183     if(index >= count)
184     {
185         cout << "The index in out of bound!" << endl;
186     }
187     else
188     {
189         SNode<T> *pindex = getNode(index - 1);
190         SNode<T> *ptmp = pindex->next;
191         pindex->next = pindex->next->next;
192         delete ptmp;
193         ptmp = NULL;
194         count--;
195     }
196 }
197 
198 template<class T>
199 void SingleLink<T>::deleteFirst()
200 {
201     if(count == 0)
202     {
203         cout << "This single link is null!";
204         return;
205     }
206     SNode<T> *ptmp = pHead;
207     pHead = pHead->next;
208     delete ptmp;
209     ptmp = NULL;
210     count--;
211 }
212 
213 template<class T>
214 void SingleLink<T>::deleteLast()
215 {
216     del(count - 1);
217 }
218 
219 #endif
View Code

相关文章: