1. 程式人生 > >對單鏈表的一些操作(待補充)

對單鏈表的一些操作(待補充)

改變 let 反轉 clas 循環 nbsp () data pri

所有的數據和結點的定義都用簡單的數據類型而不是用模板,重在解決問題的思想和寫代碼能力。

結點定義如下:

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 }

對單鏈表的一些操作(待補充)