头节点为空哨兵
template <class T>
struct Node
{
Node *next;
T data;
Node(const T &t = T()) : data(t), next(0) {} // T():一个空的T类型
};
template <class T>
class List
{
Node<T> *head; //排头兵
Node<T> *tail;
int sz;
public:
List()
{
...
head =new Node<T>()//初始化一个空的排头兵
}
...
};
pop_back:
逆转链表:
①头插法:
建立链表有头插法和尾插法两种
头插法的好处就是在插入和删除尾元素的时候时间复杂度都是O(1)
带头节点的头插法的简便写法:
template<class T>
void LinkStack<T>::push(const T& item)//压栈
{ myTop->next=new T(item,myTop->next);
/* Node<T>* p=new T(item);
p->next=myTop->next;
myTop->next=p; */
}
逆转 :
template<class T>
LinkNode<T>* List<T>::Reverse(LinkNode<T>* p)
{
//摘下节点,头插表
LinkNode<T>* head=NULL;
while(p){
LinkNode<T>* node=p->next;
p->next=head;
head=p;
p=node;
}
return head;
}
②双指针法:
③递归:
方法一(本质是双指针):
方法二 (本质是头插法):
如果想要交换两个链表其实只需要交换头尾指针
vector相类似 的交换也只是交换buf