📜  使用类在 C++ 中实现单向链表的程序

📅  最后修改于: 2022-05-13 01:57:43.301000             🧑  作者: Mango

使用类在 C++ 中实现单向链表的程序

链表将数据存储在顺序存储中,就像数组一样。尽管数据是按顺序存储的,但存储位置并不连续。
与数组不同,链表可以存储不同数据类型的数据。
下图表示链表结构。

在 C++ 中,链表可以分别用一个类和一个Node类来表示,它有两个成员,即 data 和一个指向下一个节点的next指针。

InsertNode :在本文中,插入是在列表的末尾完成的。按照步骤在链表中插入节点。

  • 假设要在现有链表上插入4 ,即1 -> 2 -> 3 。结果链表将是1 -> 2 -> 3 -> 4。
  • 插入一个新节点,遍历到列表的末尾,直到找到 NULL 节点。
  • 创建一个新节点,并将新节点链接到链表的最后一个节点。

DeleteNode :在本文中,删除是使用节点的索引完成的。请按照以下步骤删除节点:



  • 如果要删除的节点是头节点,则将存储在临时变量中。然后将head更新为head->next 。删除temp
  • 如果要删除的节点的索引大于列表的长度,则从函数返回。
  • 遍历直到要删除的节点。删除节点,并将前一个节点链接到被删除节点的下一个节点。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
  
// Node class to represent
// a node of the linked list.
class Node {
public:
    int data;
    Node* next;
  
    // Default constructor
    Node()
    {
        data = 0;
        next = NULL;
    }
  
    // Parameterised Constructor
    Node(int data)
    {
        this->data = data;
        this->next = NULL;
    }
};
  
// Linked list class to
// implement a linked list.
class Linkedlist {
    Node* head;
  
public:
    // Default constructor
    Linkedlist() { head = NULL; }
  
    // Function to insert a
    // node at the end of the
    // linked list.
    void insertNode(int);
  
    // Function to print the
    // linked list.
    void printList();
  
    // Function to delete the
    // node at given position
    void deleteNode(int);
};
  
// Function to delete the
// node at given position
void Linkedlist::deleteNode(int nodeOffset)
{
    Node *temp1 = head, *temp2 = NULL;
    int ListLen = 0;
  
    if (head == NULL) {
        cout << "List empty." << endl;
        return;
    }
  
    // Find length of the linked-list.
    while (temp1 != NULL) {
        temp1 = temp1->next;
        ListLen++;
    }
  
    // Check if the position to be
    // deleted is less than the length
    // of the linked list.
    if (ListLen < nodeOffset) {
        cout << "Index out of range"
             << endl;
        return;
    }
  
    // Declare temp1
    temp1 = head;
  
    // Deleting the head.
    if (nodeOffset == 1) {
  
        // Update head
        head = head->next;
        delete temp1;
        return;
    }
  
    // Traverse the list to
    // find the node to be deleted.
    while (nodeOffset-- > 1) {
  
        // Update temp2
        temp2 = temp1;
  
        // Update temp1
        temp1 = temp1->next;
    }
  
    // Change the next pointer
    // of the previous node.
    temp2->next = temp1->next;
  
    // Delete the node
    delete temp1;
}
  
// Function to insert a new node.
void Linkedlist::insertNode(int data)
{
    // Create the new Node.
    Node* newNode = new Node(data);
  
    // Assign to head
    if (head == NULL) {
        head = newNode;
        return;
    }
  
    // Traverse till end of list
    Node* temp = head;
    while (temp->next != NULL) {
  
        // Update temp
        temp = temp->next;
    }
  
    // Insert at the last.
    temp->next = newNode;
}
  
// Function to print the
// nodes of the linked list.
void Linkedlist::printList()
{
    Node* temp = head;
  
    // Check for empty list.
    if (head == NULL) {
        cout << "List empty" << endl;
        return;
    }
  
    // Traverse the list.
    while (temp != NULL) {
        cout << temp->data << " ";
        temp = temp->next;
    }
}
  
// Driver Code
int main()
{
    Linkedlist list;
  
    // Inserting nodes
    list.insertNode(1);
    list.insertNode(2);
    list.insertNode(3);
    list.insertNode(4);
  
    cout << "Elements of the list are: ";
  
    // Print the list
    list.printList();
    cout << endl;
  
    // Delete node at position 2.
    list.deleteNode(2);
  
    cout << "Elements of the list are: ";
    list.printList();
    cout << endl;
    return 0;
}


输出
Elements of the list are: 1 2 3 4 
Elements of the list are: 1 3 4 

时间复杂度: O(N)
辅助空间: O(N)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程