#pragma once
#include <iostream>
#include <vector>
#include <stack>
template <class object>
struct ListNode
{
object data;
struct ListNode<object> *next;
ListNode<object>(int x):data(x),next(NULL){}
};
template <class object>
//构造链表
ListNode<object> *creatListOfhead()
{
//带头结点的链表
ListNode<object> *head=NULL;
ListNode<object> *pHead=NULL;
head=new ListNode<object>(sizeof(ListNode<object>));
head->next=NULL;
int listLenght=0;
object elem;
std::cout<<"构造链表的长度:"<<std::endl;
cin>>listLenght;
for (int i=0;i<listLenght;++i)
{
pHead=new ListNode<object>(sizeof(ListNode<object>));
if (pHead)
{
std::cin>>elem;
pHead->data=elem;
pHead->next=head->next;
head->next=pHead;
}
}
return head->next;
};
//打印链表
template <class object>
void printList(ListNode<object> *list)
{
if (list==NULL)
{
return ;
}
else
{
ListNode<object> *pHead=list;
while (pHead!=NULL)
{
std::cout<<pHead->data<<" ";
pHead=pHead->next;
}
}
std::cout<<std::endl;
return ;
}
template <class object>
ListNode<object>* createListOfRear()
{
ListNode<object> *head=NULL;
ListNode<object> *newHead=NULL;
head=new ListNode<object>(sizeof(ListNode<object>));
head->next=NULL;
newHead=head;
ListNode<object> *pHead=NULL;
int listLenght=0;
object elem;
std::cout<<"构造链表的长度:"<<std::endl;
std::cin>>listLenght;
for (int i=0;i<listLenght;++i)
{
pHead=new ListNode<object>(sizeof(ListNode<object>));
if (pHead)
{
std::cin>>elem;
pHead->data=elem;
pHead->next=head->next;
head->next=pHead;
head=pHead;
}
}
//std::cout<<std::endl;
return newHead->next;
}
//按位置插入
template <class object>
ListNode<object> *insertNodeOfIndex(ListNode<object> *list,object index)
{
ListNode<object> *newList=NULL;
ListNode<object> *head=list->next;
newList=list;
int count=0;
object elem;
while (head!=NULL&&count<index-1)
{
head=head->next;
count++;
}
if (count!=index-1)
{
cout<<"index 太大或者index 为0"<<endl;
}
else
{
ListNode<object> *newNode=NULL;
newNode=new ListNode<object>(sizeof(ListNode<object>));
if (newNode)
{
cin>>elem;
newNode->data=elem;
newNode->next=head->next;
head->next=newNode;
}
}
return newList;
}
//按值插入
template <class object>
ListNode<object> *insertNodeOfval(ListNode<object> *list,object elem)
{
ListNode<object> *newList=NULL,*head=NULL;
newList=head=list;
ListNode<object> *pHead=list->next;
while (pHead&&pHead->data!=elem)
{
head=pHead;
pHead=pHead->next;
}
if (pHead->data==elem)
{
object data;
ListNode<object> *newNode=new ListNode<object>(sizeof(ListNode<object>));
if (newNode)
{
cin>>data;
newNode->data=data;
newNode->next=head->next;
head->next=newNode;
}
}
else
{
cout<<"不存在这个val"<<endl;
}
return newList;
}
//按位置删除
template <class object>
ListNode<object> *deleteNodeOfIndex(ListNode<object> *list,object index)
{
ListNode<object> *head=list;
ListNode<object> *newList=head;
ListNode<object> *pHead=list->next;
int count=1;
while (head->next!=NULL&&count<index)
{
head=pHead;
pHead=pHead->next;
count++;
}
if (count!=index)
{
cout<<"下标太大了或者为0"<<endl;
}
else
{
head->next=pHead->next;
delete pHead;
}
return newList;
}
//按值删除
template<class object>
ListNode<object> *deleteNodeOfKey(ListNode<object> *list,object key)
{
ListNode<object> *head=list;
ListNode<object> *deletNode=list->next;
while(deletNode!=NULL&&deletNode->data!=key)
{
head=deletNode;
deletNode=deletNode->next;
}
if (deletNode->data==key)
{
head->next=deletNode->next;
delete deletNode;
}
else
{
cout<<"结点不存在"<<endl;
}
return list;
}
//删除重复的
template<class object>
ListNode<object> *deleteDupp1(ListNode<object> *list)
{
ListNode<object> *head=list;
while (head->next!=NULL)
{
if (head->data==head->next->data)
{
head->next=head->next->next;
}
else
{
head=head->next;
}
}
return list;
}
template<class object>
//删除两个重复的
ListNode<object> *deleteDupp2(ListNode<object> *list)
{
ListNode<object> *head=list;
ListNode<object> *newListNodeHead=new ListNode<object>(sizeof(ListNode<object>));
newListNodeHead->next=head;
ListNode<object> *newList=newListNodeHead;
while (head)
{
while(head->next!=NULL&&head->data==head->next->data)
{
head=head->next;
}
//if (newList->next==head)
//{
newList=head;
///head=head->next;
//}
//else
//{
head=head->next;
newList->next=head;
//}
}
return newListNodeHead->next;
}
template<class object>
//删除链表中连续重复的值
ListNode<object> *deleteSameVal(ListNode<object> *list,object SameVal)
{
ListNode<object> *head=list;
ListNode<object> *sameNode=NULL;
ListNode<object> *pHead=list->next;
while (pHead)
{
if (pHead->data==SameVal)
{
sameNode=pHead;
pHead=pHead->next;
head->next=pHead;
delete sameNode;
}
else
{
head=pHead;
pHead=pHead->next;
}
}
return list;
}
//反转链表
template<class object>
ListNode<object> *reverseList(ListNode<object> *list)
{
ListNode<object> *reverse_list=new ListNode<object>(sizeof(ListNode<object>));
reverse_list->next=NULL;
ListNode<object> *re=reverse_list;
ListNode<object> *head=list;
while (head!=NULL)
{
ListNode<object> *pHead=head->next;
head->next=reverse_list->next;
reverse_list->next=head;
head=pHead;
}
return re->next;
}
//反转链表
template<class object>
ListNode<object> *revList(ListNode<object> *list)
{
ListNode<object> *headNode=new ListNode<object>(sizeof(ListNode<object>));
headNode->next=list;
ListNode<object> *pre=list;
ListNode<object> *pcur=list->next;
while(pcur)
{
pre->next=pcur->next;
pcur->next=headNode->next;
headNode->next=pcur;
pcur=pre->next;
}
return headNode->next;
}