一、线性表
定义:线性表是 n (≥0)个元素构成的有序序列( a1,a2,a3,......)。
操作:
//ElementType 表示元素类型,i是指链表的位置
List MakeEmpty()//初始化一个空线性表L;
ElementType FindKth( int K, List L )//根据位序K,返回相应元素 ;
int Find( ElementType X, List L ) //在线性表L中查找X的第一次出现位置;
void Insert( ElementType X, int i, List L) //在位序i前插入一个新元素X;
void Delete( int i, List L ) // 删除指定位序i的元素;
int Length( List L ) //返回线性表L的长度n。
二、顺序储存实现
利用数组的连续存储空间顺序存放线性表的各元素。
特点:查找和求长度时间效率高O(1),插入和删除时间效率低O(n)。
表示:
const int MaxSize = 100; //链表最大容量为100
typedef struct LNode* List;
struct LNode{
int Data[MaxSize];
int Last; //链表储存最后一个元素的位置
};
List PtrL;
1、创建空链表
List MakeList(){
List L = new LNode;
L->Last = -1;
return L;
}
2、查找位序K的元素
int FindKth(List L,int K){
if(L==nullptr || K<0)
throw new exception("Invalid Input");
return L->Data[K];
}
3、查找元素值为X的链表位序
int Find(List L,int X){
if(L == nullptr)
return -1;
int i = 0;
while(i<=L->Last)
{
if(L->Data[i] == X)
return i;
}
return -1;
}
4、在第i位置插入元素X
void Insert(List L,int i,int X){
if(L == nullptr||L->Last==MaxSize)
return;
if(i<1||i>L->Last+2;
for(int h=Last;h>=i;++h)
{
L->Data[h+1] = L->Data[h];
}
L->Data[i-1] = X;
L->Last++;
return;
}
5、删除表第i位置上的元素
void Delete(List L,int i){
if(L==nullptr)
return;
if(i<0 || i>last+2)
return;
for(int h=i-1;h<Last;++h)
{
L->Data[h] = L->Data[h+1];
}
L->Last--;
}
6、求链表长度
int Length(List L){
if(L==nullptr)
return -1;
return L->Last;
}
二、链表实现
储存地址可以不连续,但通过“链”形式可以逻辑上两个元素相邻。
特点:插入和删除时并不需要移动元素
表示:
typedef struct LNode* List;
struct LNode{
int Data;
LNode* Next;
}
List L;
1、创建空链表
List MakeList(){
List L = new LNode();
L->Next = nullptr;
return L;
}
2、查找位序K的节点
List FindKth(List *L,int K){
if(K<0)
return nullptr;
List p =*L;
int count = 0;
while(p!=nullptr &&count!=K){
p=p->Next;
count++;
}
if(count==K)
return p;
else
return nullptr;
}
3、查找元素值为X的节点
List Find(List *L,int X){
List p =*L;
while(p!=nullptr&&p->Data!=X){
p = p->Next;
}
if(p->Data == X)
return p;
else
return nullptr;
}
4、在第i个节点前插入值为X的新节点
List Insert(List *L,int i,int X){
if(i<0)
return nullptr;
if(i==1){
List NewNode = new LNode ();
NewNode->Data = X;
NewNode->Next = *L;
return NewNode;
}
List p =*L;
int count =0;
while(p!=nullptr&&count!=i-1){
p = p->Next;
++count;
}
if(p==nullptr)
return nullptr;
else{
List NewNode = new LNode;
NewNode->Data = X;
NewNode->Next = p->Next;
p->Next = NewNode;
return *L;
}
}
5、删除表第i位置上的元素
List Delete(List *L,int i){
if(i<0)
return nullptr;
if(i==1){
List p = *L;
if(p!=nullptr)
p=p->Next;
else
return nullptr;
delete *L;
return p;
}
List p = *L;
int count =0;
while(p!=nullptr&&count!=i-1){
p=p->Next;
i++;
}
if(p==nullptr)
return nullptr;
else{
List x = p->Next;
p->Next = x->Next;
delete x;
x = nullptr;
return L;
}
}
三、面试题
1、从尾到头打印链表每个节点的值
//反转链表
void PrintListReversingly_Iteratively(List pHead){
if(pHead==nullptr)
return;
if(pHead->Next==nullptr)
cout<<pHead->Data<<endl;
List p0 = pHead;
List p1 = pHead->Next;
List p2 = pHead->Next->Next;
while(p2!=nullptr){
p1->Next=p0;
p0=p1;
p1=p2;
p2=p2->Next;
}
while(p1!=pHead){
cout<<p1->Data<<" ";
p1=p1->Next;
}
cout<<p1->Data<<endl;
p0=p1=p2=nullptr;
}
//栈实现
void PrintListReversingly_Iteratively(List pHead){
if(pHead==nullptr)
return;
stack<List>nodes;
List p = pHead;
while(p!=nullptr){
nodes.push(p->Data);
p=p->Next;
}
while(!nodes.empty()){
cout<<nodes.top()<<" ";
nodes.pop();
}
}