对单链表的一些操作(待补充)

所有的数据和结点的定义都用简单的数据类型而不是用模板,重在解决问题的思想和写代码能力。

结点定义如下:

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 }

猜你喜欢

转载自www.cnblogs.com/Royzzzzz/p/10574076.html