1. 程式人生 > 其它 >連結串列——自己動手寫了一下C++的

連結串列——自己動手寫了一下C++的

技術標籤:Datawhale--LeetCode50題預備知識連結串列指標資料結構c++

連結串列

連結串列是一種資料結構,是一種功能極其強大的陣列。連結串列可以很輕鬆的進行增添,刪除,插入節點。


目錄

連結串列

單向連結串列

1.建立連結串列

1.1建立節點

1.2初始化

2.連結串列長度

3.連結串列列印

4.查詢節點

5.刪除節點

6.增加節點

7.修改節點

完整程式碼



單向連結串列

初學者一般先從單向連結串列開始,單向連結串列的操作一般包括:建立,修改,插入,輸出,排序,反序,清空,求長度。


1.建立連結串列

利用結構體來定義節點,通過指標來實現連結串列

1.1建立節點

利用結構體進行建立連結串列的節點

struct NodeList
{
  int val;
  NodeList *next;
};

下面再進行連結串列的節點定義時,可以直接用NodeList *node來進行定義

1.2初始化

建立n個節點的單向連結串列

NodeList *CreateList(int &n)
{
  NodeList *head,*node,*end; //建立頭節點,中間節點,尾節點
  head=new NodeList;      //給頭結點分配地址
  end=head;           //令尾節點等於頭結點
  for(int i=0;i<n;i++)
   {
    node =new NodeList; //給每一個Node分配地址
    cin>>node.val;      //輸入每一個節點的值
    end.next=node;      //讓尾節點(第一次是頭節點)的指標指向下一個節點
    end=node;           //讓尾節點等於新新增的節點
   }
  end.next=NULL;      //給最後一個節點的下一個節點置空
  return head;        //返回頭部指標
}


2.連結串列長度

返回連結串列的長度,即length或者size

int length(ListNode *head) //返回連結串列的長度
{
  ListNode *p = new ListNode;
  p = head;
  int len = 0;
  while (p->next != nullptr)
   {
    p = p->next;
    len++;
   }
  return len;
}

3.連結串列列印

通過迴圈來列印連結串列的節點

void PrintList(ListNode *head) //列印連結串列
{
  ListNode *p = head;
  while (p->next != nullptr)
   {
    p = p->next;
    cout << p->val << " ";
   }
}
​

4.查詢節點

通過遍歷查詢是否存在(返回節點的第一次出現的位置)


int FindNode(ListNode *head, const int &n) //查詢連結串列中是否存在n,存在返回第一次位置,不存在返回-1
{
  ListNode *p = new ListNode;
  p = head;
  int Pos = 0;
  while (p->next != nullptr)
   {
    p = p->next;
    Pos++;
    if (p->val == n)
      return Pos;
   }
  return -1;
}

5.刪除節點

找到連結串列的第n個節點,通過修改指標,讓n個節點的上一個節點指向n的下一個節點,釋放第n個節點

bool DeleteNode(ListNode *head, const int n) //刪除連結串列的第n個節點
{
  if (length(head) < n)
    return false;
  ListNode *temp = new ListNode;
  for (int i = 0; i < n - 1; i++)
   {
    head = head->next;
   }
  temp = head->next;
  head->next = head->next->next;
  delete (temp);
  return true;
}

6.增加節點

通過修改指標的指向來在中間新增節點

bool AddNode(ListNode *head, const int Pos, const int value) //新增一個節點,在pos這個位置新增一個數值為value的節點
{
  if (length(head) < Pos)
    return false;
  for (int i = 0; i < Pos - 1; i++)
   {
    head = head->next;
   }
  ListNode *temp = new ListNode;
  temp->val = value;
  temp->next = head->next;
  head->next = temp;
  return true;
}

7.修改節點

先查詢到節點,在修改節點的值

bool ChangeNode(ListNode *head, const int Pos, const int Value) //修改節點 修改位置pos上的值為value
{
  if (length(head) < Pos)
    return false;
  for (int i = 0; i < Pos; i++)
   {
    head = head->next;
   }
  head->val = Value;
  return true;
}

完整程式碼

/**
 * @分函式編寫單鏈表
 * 
 * 
 * @1.連結串列建立 √
 * @2.連結串列長度 √
 * @3.連結串列列印 √
 * @4.查詢節點 √ 返回位置
 * @5.刪除節點 √
 * @6.增加節點 √
 * @7.修改節點 √
 * 
 * 
 * @Progra:Zbooo
 **/

#include <iostream>
using namespace std;

struct ListNode
{
    int val;
    ListNode *next;
};

ListNode *CreatNode(int &n) //建立n個節點的連結串列
{
    ListNode *head, *node, *end;
    head = new ListNode;
    end = head;
    for (int i = 0; i < n; i++)
    {
        node = new ListNode;
        cin >> node->val;
        end->next = node;
        end = node;
    }
    end->next = nullptr;
    return head;
}

void PrintList(ListNode *head) //列印連結串列
{
    ListNode *p = head;
    while (p->next != nullptr)
    {
        p = p->next;
        cout << p->val << " ";
    }
}

int length(ListNode *head) //返回連結串列的長度
{
    ListNode *p = new ListNode;
    p = head;
    int len = 0;
    while (p->next != nullptr)
    {
        p = p->next;
        len++;
    }
    return len;
}

int FindNode(ListNode *head, const int &n) //查詢連結串列中是否存在n,存在返回位置,不存在返回-1
{
    ListNode *p = new ListNode;
    p = head;
    int Pos = 0;
    while (p->next != nullptr)
    {
        p = p->next;
        Pos++;
        if (p->val == n)
            return Pos;
    }
    return -1;
}

bool DeleteNode(ListNode *head, const int &n) //刪除連結串列的第n個節點
{
    if (length(head) < n)
        return false;
    ListNode *temp = new ListNode;
    for (int i = 0; i < n - 1; i++)
    {
        head = head->next;
    }
    temp = head->next;
    head->next = head->next->next;
    delete (temp);
    return true;
}

bool AddNode(ListNode *head, const int Pos, const int &value) //新增一個節點,在pos這個位置新增一個數值為value的節點
{
    if (length(head) < Pos)
        return false;
    for (int i = 0; i < Pos - 1; i++)
    {
        head = head->next;
    }
    ListNode *temp = new ListNode;
    temp->val = value;
    temp->next = head->next;
    head->next = temp;
    return true;
}

bool ChangeNode(ListNode *head, const int Pos, const int &Value) //修改節點 修改位置pos上的值為value
{
    if (length(head) < Pos)
        return false;
    for (int i = 0; i < Pos; i++)
    {
        head = head->next;
    }
    head->val = Value;
    return true;
}

int main()
{
    int n;
    cin >> n;
    ListNode *head = new ListNode;
    head = CreatNode(n);
    DeleteNode(head, 3);
    AddNode(head, 3, 10);
    ChangeNode(head, 3, 10);
    cout << FindNode(head, 3) << endl;
    PrintList(head);
    system("pause");
    return 0;
}