链表的各种实现
数据结构第一站——单向表
#include<iostream>
using namespace std;
struct LinkNode
{
int data;
LinkNode *next;
};
class LinkList
{
public:
LinkList();
void Insert(int data);//插入节点
void Delete(int data);//删除节点
int GetLength();//返回链表长度
void Reverse();//反转链表
int FindPosition(int data);//查找data在链表中的位置
void Print();//输出
private:
LinkNode *head;
int length;
};
LinkList::LinkList()
{
head = NULL;
length = 0;
}
void LinkList::Insert(int data)
{
if (head == NULL)
{
LinkNode *newNode = new LinkNode;
newNode->data = data;
newNode->next = NULL;
head = newNode;
length++;
}
else
{
LinkNode *Node1 = head;
LinkNode *Node2 = new LinkNode;
Node2->data = data;
Node2->next = NULL;
while (Node1->next)
{
Node1 = Node1->next;
}
Node1->next = Node2;
length++;
}
}
void LinkList::Delete(int data)
{
LinkNode *p = head;
int pos = FindPosition(data);
int count=0;
if (pos == -1)
{
cout << "NO EXIST" << endl;
}
else if (pos == 1)
{
head = head->next;
length--;
}
else if (pos == length)
{
while (p->next->next)
{
p = p->next;
}
p->next = NULL;
length--;
}
else
{
p = head;
for (int i = 0; i < pos - 2; i++)
{
p = p->next;
}
p->next = p->next->next;
length--;
}
}
int LinkList::FindPosition(int data)
{
int count=0;
LinkNode *p = head;
while (p)
{
count++;
if (p->data == data)
return count;
p = p->next;
}
return -1;
}
int LinkList::GetLength()
{
return length;
}
void LinkList::Reverse()
{
LinkNode *p, *q, *temp;
//p q 两个节点轮换反转,temp用于保存下一个待反转的节点
p = head;
q = p->next;
while (q)
{
temp = q->next;
q->next = p;
p = q;
q = temp;
}
head->next = NULL;
head = p;
}
void LinkList::Print()
{
LinkNode *p = head;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl << length << endl;
}
测试代码
#include "LinkNode.h"
int main()
{
LinkList *link=new LinkList;
link->Insert(3);
link->Insert(4);
link->Insert(5);
link->Insert(6);
link->Insert(1);
link->Delete(5);
link->Reverse();
link->Print();
system("pause");
return 0;
}
测试结果
复习