所有的数据和结点的定义都用简单的数据类型而不是用模板,重在解决问题的思想和写代码能力。
结点定义如下:
1 struct Node
2 {
3 int data;
4 struct Node * next;
5 };
链表类定义
class LinkList
{
public:
LinkList();
LinkList(int a[], int n);
~LinkList();
void Insert(int i, int x);
int Delete(int i);
void PrintList();
//就地逆置一个链表(反转)
void reverse();
//循环逆置一个链表;
void Reverse();
private:
Node * first;
};
头插法建立链表:
1 LinkList::LinkList(int a[], int n)
2 {
3 first = new Node;
4 first->next = nullptr;
5 for (int i = 0; i < n; i++) {
6 auto s = new Node;
7 s->data = a[i];
8 s->next = first->next;
9 first->next = s;
10
11 }
12 }
尾插法建立链表:
1 LinkList::LinkList(int a[], int n) {
2 first = new Node;
3 auto p = first; //你不能试图改变头指针指向头结点
4 for (int i = 0; i < n; i++) {
5 auto s = new Node;
6 s->data = a[i];
7 p->next = s;
8 p = s;
9 }
10 p->next = nullptr;
11 }
在第i个位置插入值为的X结点:
void LinkList::Insert(int i, int x)
{
int cnt = 0;
auto p = first;
while (p->next&&cnt<i-1)
{
p = p->next;
cnt++;
}
if (p == nullptr) throw "locate";
else {
auto s = new Node;
s->data = x;
s->next = p->next;
p->next = s;
}
}
删除第i个位置的结点:
1 int LinkList::Delete(int i)
2 {
3 int cnt = 0;
4 auto p = first;
5 while (p->next&&cnt<i-1)
6 {
7 p = p->next;
8 cnt++;
9 }
10 if (p == nullptr) throw "locate";
11 else {
12 auto q = p->next;
13 int x = p->next->data;
14 p->next = q->next;
15 delete q;
16 return x;
17 }
18 return 0;
19 }