📜  LinkedList数据结构

📅  最后修改于: 2020-09-28 02:35:46             🧑  作者: Mango

在本教程中,您将了解链表数据结构及其在Python,Java,C和C++中的实现。

链表数据结构包括一系列连接的节点。在这里,每个节点都存储下一个节点的数据和地址。例如,

linkedlist data structure
Linkedin数据结构

您必须从某个地方开始,所以我们给第一个节点的地址一个特殊的名称,称为HEAD

同样,可以确定链表中的最后一个节点,因为其下一部分指向NULL

您可能玩过寻宝游戏,其中每个线索都包含有关下一个线索的信息。这就是链接列表的操作方式。


LinkedList的表示

让我们看看如何表示LinkedList的每个节点。每个节点包括:

  • 数据项
  • 另一个节点的地址

我们将数据项和下一个节点引用都包装在一个结构中,如下所示:

struct node
{
  int data;
  struct node *next;
};

了解链接列表节点的结构是掌握链接列表节点的关键。

每个结构节点都有一个数据项和一个指向另一个结构节点的指针。让我们创建一个包含三个项目的简单链接列表,以了解其工作原理。

/* Initialize nodes */
struct node *head;
struct node *one = NULL;
struct node *two = NULL;
struct node *three = NULL;

/* Allocate memory */
one = malloc(sizeof(struct node));
two = malloc(sizeof(struct node));
three = malloc(sizeof(struct node));

/* Assign data values */
one->data = 1;
two->data = 2;
three->data=3;

/* Connect nodes */
one->next = two;
two->next = three;
three->next = NULL;

/* Save address of first node in head */
head = one;

如果您不懂上述任何几行,那么您只需要对指针和结构进行复习。

仅需几个步骤,我们就创建了一个包含三个节点的简单链表。

representing linked list by connecting each node with next node using address of next node
LinkedList表示形式

LinkedList的功能来自断开链并重新加入链的能力。例如,如果您想将元素4放在1和2之间,则步骤为:

  • 创建一个新的结构节点并为其分配内存。
  • 将其数据值加为4
  • 将其下一个指针指向包含2作为数据值的struct节点
  • 将下一个指针“ 1″更改为我们刚刚创建的节点。

在数组中执行类似操作将需要移动所有后续元素的位置。

在Python和Java中,可以使用如下代码所示的类来实现链表。


链表实用程序

列表是最流行和最有效的数据结构之一,可以在每种编程语言(如C,C++, Python,Java和C#)中实现。

除此之外,链接列表是了解指针如何工作的好方法。通过练习如何操作链表,您可以准备学习更高级的数据结构,例如图形和树。


Python,Java,C和C++示例中的链表实现

Python
爪哇
C
C +
# Linked list implementation in Python


class Node:
    # Creating a node
    def __init__(self, item):
        self.item = item
        self.next = None


class LinkedList:

    def __init__(self):
        self.head = None


if __name__ == '__main__':

    linked_list = LinkedList()

    # Assign item values
    linked_list.head = Node(1)
    second = Node(2)
    third = Node(3)

    # Connect nodes
    linked_list.head.next = second
    second.next = third

    # Print the linked list item
    while linked_list.head != None:
        print(linked_list.head.item, end=" ")
        linked_list.head = linked_list.head.next
// Linked list implementation in Java

class LinkedList {
  // Creating a node
  Node head;

  static class Node {
    int value;
    Node next;

    Node(int d) {
      value = d;
      next = null;
    }
  }

  public static void main(String[] args) {
    LinkedList linkedList = new LinkedList();

    // Assign value values
    linkedList.head = new Node(1);
    Node second = new Node(2);
    Node third = new Node(3);

    // Connect nodess
    linkedList.head.next = second;
    second.next = third;

    // printing node-value
    while (linkedList.head != null) {
      System.out.print(linkedList.head.value + " ");
      linkedList.head = linkedList.head.next;
    }
  }
}
// Linked list implementation in C

#include 
#include 

// Creating a node
struct node {
  int value;
  struct node *next;
};

// print the linked list value
void printLinkedlist(struct node *p) {
  while (p != NULL) {
    printf("%d ", p->value);
    p = p->next;
  }
}

int main() {
  // Initialize nodes
  struct node *head;
  struct node *one = NULL;
  struct node *two = NULL;
  struct node *three = NULL;

  // Allocate memory
  one = malloc(sizeof(struct node));
  two = malloc(sizeof(struct node));
  three = malloc(sizeof(struct node));

  // Assign value values
  one->value = 1;
  two->value = 2;
  three->value = 3;

  // Connect nodes
  one->next = two;
  two->next = three;
  three->next = NULL;

  // printing node-value
  head = one;
  printLinkedlist(head);
}
// Linked list implementation in C++

#include 
using namespace std;

// Creating a node
class Node {
   public:
  int value;
  Node* next;
};

int main() {
  Node* head;
  Node* one = NULL;
  Node* two = NULL;
  Node* three = NULL;

  // allocate 3 nodes in the heap
  one = new Node();
  two = new Node();
  three = new Node();

  // Assign value values
  one->value = 1;
  two->value = 2;
  three->value = 3;

  // Connect nodes
  one->next = two;
  two->next = three;
  three->next = NULL;

  // print the linked list value
  head = one;
  while (head != NULL) {
    printf("%d ", head->value);
    head = head->next;
  }
}

链表复杂度

时间复杂度

  Worst case Average Case
Search O(n) O(n)
Insert O(1) O(1)
Deletion O(1) O(1)

空间复杂度:O(n)


链表应用

  • 动态内存分配
  • 在堆栈和队列中实现
  • 撤消软件功能
  • 哈希表,图形

推荐读物

1.教程

  • LinkedList操作(遍历,插入,删除)
  • LinkedList的类型
  • Java LinkedList

2.例子

  • 一次迭代即可获取LinkedList的中间元素
  • 将LinkedList转换为数组,反之亦然
  • 检测LinkedList中的循环