类实现,单链表
节点类 Node
节点 应包括数据值 data 以及指向下一个节点的指针 next。
#include<iostream>
using namespace std;
typedef int DataType;
class Node
{
public:
Node() {}
~Node() {}
void SetData(DataType tempdata) { data = tempdata; }
DataType GetData() { return data; }
void SetNext(Node *tempnode) { next = tempnode; }
Node* GetNext() { return next; }
private:
DataType data;
Node *next;
};
链表类 LinkList
链表类作为主类,对链表中的节点进行操作(增、删、改、查…)
- 此链表没有哨兵节点(即 head 指向的就是第一个节点) ;
- 相关注释写于代码中;
class LinkList
{
private:
Node *head;
Node *last;
int length;
public:
LinkList()
{
head = NULL;
last = NULL;
length = 0;
}
~LinkList()
{
if (head != NULL)
{
Node *temp = NULL, *p = NULL;
temp = head;
while (temp != NULL)
{
p = temp;
temp = temp->GetNext();
delete p;
}
}
}
void display()
{
Node *temphead = head;
while(temphead != NULL)
{
cout<<temphead->GetData()<<" ";
temphead = temphead->GetNext();
}
cout<<endl;
}
DataType get(int index)
{
if(index > length || index < 0)
return -1;
Node *temp = head;
int i = 0;
while(i < index)
{
temp = temp->GetNext();
i++;
}
return temp->GetData();
}
void addAtHead(int val)
{
Node *temphead = head;
Node *a = new Node();
a->SetData(val);
a->SetNext(temphead);
if(length==0)
{
last = a;
}
head = a;
length++;
}
void addAtTail(int val) {
if(length == 0)
{
Node *a = new Node();
a->SetData(val);
a->SetNext(NULL);
head = a;
last = a;
length++;
}else{
Node *templast = last;
Node *a1 = new Node();
a1->SetData(val);
a1->SetNext(templast->GetNext());
templast->SetNext(a1);
last = a1;
length++;
}
}
void addAtIndex(int index, int val)
{
if(index > length || index < 0)
{
return ;
}
else if(index == length)
{
addAtTail(val);
}
else{
Node *temphead = head;
int i = 0;
while(i < index)
{
temphead = temphead->GetNext();
i++;
}
Node *pnext = temphead->GetNext();
Node *a = new Node();
a->SetData(val);
a->SetNext(pnext);
temphead->SetNext(a);
length++;
}
}
void deleteAtIndex(int index)
{
if(index > length || index < 0)
{
return ;
}
else if(index == 0){
Node *temphead = head;
head = head->GetNext();
delete temphead;
length--;
}else if(index == length - 1 && index != 0){
Node *templast = last;
Node *temp = head;
while(temp->GetNext() != templast)
{
temp = temp->GetNext();
}
last = temp;
last->SetNext(NULL);
delete templast;
length--;
}else{
int i = 0;
Node *temphead = head;
while(i < index - 1)
{
temphead = temphead->GetNext();
i++;
}
Node *pnext = temphead->GetNext();
Node *q = pnext;
temphead->SetNext(q->GetNext());
length--;
delete q;
}
}
Node* reverseList()
{
if (!head){ return NULL; }
Node *p, *r;
p = head->GetNext();
head->SetNext(NULL);
while (p != NULL)
{
r = p->GetNext();
p->SetNext(head);
head = p;
p = r;
}
return head;
}
};
测试
int main()
{
cout<<"索引值:0--index;"<<endl;
LinkList a;
a.addAtHead(1);
a.display();
a.addAtTail(2);
a.display();
a.addAtTail(3);
a.display();
a.addAtTail(4);
a.display();
a.addAtTail(5);
a.display();
a.addAtTail(6);
a.display();
cout<<endl<<"删除索引值2位置处的节点;"<<endl;
a.deleteAtIndex(2);
a.display();
cout<<endl<<"删除索引值1位置后添加节点9;"<<endl;
a.addAtIndex(1,9);
a.display();
cout<<endl<<a.get(2)<<endl;
return 0;
}
整数形(int)测试结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190726134255352.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MTI2Mjc1,size_16,color_FFFFFF,t_70)
字符型(char) 测试结果
稍作修改,见下
#include<iostream>
using namespace std;
typedef char DataType;
测试
int main()
{
cout<<"索引值:0--index;"<<endl;
LinkList a;
a.addAtHead('a');
a.display();
a.addAtTail('b');
a.display();
a.addAtTail('c');
a.display();
a.addAtTail('d');
a.display();
a.addAtTail('e');
a.display();
a.addAtTail('f');
a.display();
cout<<endl<<"删除索引值2位置处的节点;"<<endl;
a.deleteAtIndex(2);
a.display();
cout<<endl<<"删除索引值1位置后添加节点9;"<<endl;
a.addAtIndex(1,'9');
a.display();
cout<<endl<<a.get(2)<<endl;
return 0;
}
测试结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190726135242961.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MTI2Mjc1,size_16,color_FFFFFF,t_70)