一、如何定义一个链表
template<class T>
struct ListNode {
T _data;
struct ListNode<T> * _next;
};
template<class T>
struct SList {
struct ListNode<T> * _head;
};
为何_next , _head之前要加struct?
其实可以加也可以不加 struct ListNode{}; 的类型其实是 struct ListNode 而不是 ListNode
二、头插,头删,后插,后删等
三、单链表的翻转
后删头插法
首先要定义 tmp=head->next ; old_head=head;
关键点是这个old_head始终都是上图中的"1" "1"到哪儿 old_head便到了哪儿
第一步: 后删 将old_head指向tmp->next 即"1"斩断了和"2"的联系
第二步: 头插 tmp->next=head;
head=tmp; 此时换"头"了 变成了"2"
第三部: 循环 tmp=old_head->next; 将old_head->next赋给 tmp
使得整个步骤变得循环起来 old_head始终是"1"在往后直至变为最后一个元素 tmp始终是old_head的下一个元素
代码展示:
void ListReverse(SList<int> * plist) { //后删头插法
ListNode<int> * old_head = plist->_head;
ListNode<int> * tmp = plist->_head->_next;
while (tmp) {
old_head->_next = tmp->_next;
tmp->_next = plist->_head;
plist->_head = tmp;
tmp = old_head->_next;
}
}