Tìm hiểu danh sách liên kết đơn trong C++ từ A đến Z

Code Dream Team 01/03/2026
Tổng hợp từ A-Z về C++ cho người mới bắt đầu

Trong lập trình C++, danh sách liên kết đơn (singly linked list) là một cấu trúc dữ liệu quan trọng giúp bạn quản lý tập hợp các phần tử một cách linh hoạt hơn so với mảng. Việc hiểu rõ danh sách liên kết đơn trong C++ sẽ giúp bạn thao tác hiệu quả với dữ liệu thay đổi liên tục, như thêm, xóa, tìm kiếm mà không cần dịch chuyển toàn bộ mảng. Bài viết này, Code Dream sẽ giúp bạn nắm vững khái niệm, cách khai báo, thao tác cơ bản và những lưu ý khi sử dụng.

Danh sách liên kết đơn trong C++ là gì?

Danh sách liên kết đơn trong C++ (singly linked list) là một cấu trúc dữ liệu tuyến tính, bao gồm các phần tử được gọi là node. Mỗi node sẽ chứa hai phần: một giá trị dữ liệu và một con trỏ trỏ đến node kế tiếp trong danh sách. 

Khác với mảng, các phần tử trong danh sách liên kết không nằm liên tiếp trong bộ nhớ, mà được liên kết với nhau thông qua con trỏ.

Điểm đặc biệt của danh sách liên kết đơn là bạn có thể dễ dàng thêm hoặc xóa phần tử mà không cần dịch chuyển dữ liệu còn lại, điều mà mảng không làm được hiệu quả. 

Vì vậy, khi làm việc với dữ liệu có kích thước linh hoạt, linked list C++ là lựa chọn tối ưu giúp tiết kiệm bộ nhớ và tăng hiệu suất.

Dưới đây là ví dụ tối giản minh họa cách tạo một danh sách liên kết đơn trong C++ gồm 2 phần tử và in ra màn hình:

Ví dụ về cách tạo một danh sách liên kết đơn trong C++
Ví dụ về cách tạo một danh sách liên kết đơn trong C++

Khi đó kết quả sẽ hiển thị: 10 20

Ví dụ này cho thấy mỗi node chứa dữ liệu và con trỏ next trỏ đến node tiếp theo; khi next = nullptr, danh sách kết thúc.

Trước khi quyết định sử dụng cấu trúc dữ liệu nào, bạn cần hiểu rõ ưu – nhược điểm của từng loại. Dưới đây là bảng so sánh trực quan giữa Array (Mảng) và Linked List (Danh sách liên kết đơn):

Tiêu chí Mảng (Array) Danh sách liên kết (Linked List)
Cách lưu trữ Các phần tử nằm liên tiếp trong bộ nhớ Các node nằm rải rác trong bộ nhớ, liên kết bằng con trỏ
Kích thước Cố định (khai báo ban đầu) Linh hoạt, có thể tăng/giảm động
Truy cập phần tử Nhanh O(1) theo chỉ số Chậm hơn O(n), phải duyệt từ đầu
Thêm/Xóa ở giữa Tốn chi phí (phải dời phần tử) Hiệu quả nếu có con trỏ đến vị trí cần thao tác
Sử dụng bộ nhớ Tiết kiệm hơn Tốn thêm bộ nhớ cho con trỏ next
Ứng dụng phù hợp Dữ liệu cố định, truy cập ngẫu nhiên nhiều Dữ liệu thay đổi thường xuyên
Danh sách liên kết đơn trong C++ là gì?
Danh sách liên kết đơn trong C++ là gì?

Cấu trúc của danh sách liên kết đơn trong C++

Để sử dụng hiệu quả danh sách liên kết đơn trong C++, bạn cần hiểu rõ cách nó được tổ chức trong bộ nhớ. Thành phần cơ bản của danh sách liên kết đơn là node (nút), mỗi node đại diện cho một phần tử trong danh sách.

Một node thường bao gồm hai phần:

  • Giá trị (data): Chứa thông tin cần lưu trữ (có thể là số nguyên, ký tự, chuỗi,…)
  • Con trỏ (next): Trỏ đến node kế tiếp trong danh sách

Trong C++, node thường được khai báo dưới dạng một struct như sau:

struct Node {

    int data;        // Dữ liệu lưu trong node

    Node* next;      // Con trỏ đến node tiếp theo

};

Khi các node được tạo và liên kết với nhau thông qua con trỏ next, chúng tạo thành một chuỗi liên tiếp, bắt đầu từ node đầu tiên (head) và kết thúc tại node có next = nullptr.

Hiểu rõ cấu trúc này sẽ giúp bạn dễ dàng thao tác thêm, xóa, duyệt phần tử trong linked list C++ mà không bị nhầm lẫn về con trỏ và vùng nhớ.

Cách khai báo và tạo danh sách liên kết đơn trong C++

Để xây dựng danh sách liên kết đơn trong C++, bạn sẽ cần thực hiện ba bước cơ bản: khai báo cấu trúc node, tạo các node, và liên kết chúng lại bằng con trỏ. Dưới đây là hướng dẫn chi tiết cho từng bước, phù hợp cho người mới bắt đầu.

Khai báo cấu trúc node

Trong danh sách liên kết đơn, mỗi phần tử là một node. Mỗi node sẽ chứa:

  • Dữ liệu (data): thông tin bạn cần lưu (có thể là số nguyên, chuỗi, đối tượng…)
  • Con trỏ (next): liên kết node hiện tại với node tiếp theo trong danh sách.

Cú pháp khai báo một node trong C++ thường như sau:

struct Node {

    int data;      // Dữ liệu của node

    Node* next;    // Con trỏ trỏ đến node tiếp theo

};

Trong đó:

  • data lưu trữ giá trị của node.
  • next là một con trỏ kiểu Node*, dùng để trỏ đến node kế tiếp trong danh sách.

Khi một node là node cuối cùng, con trỏ next sẽ được gán giá trị nullptr.

nullptr là hằng số đặc biệt trong C++ (từ C++11), đại diện cho con trỏ không trỏ đến vùng nhớ hợp lệ nào. Nhờ có nullptr, chương trình có thể xác định chính xác điểm kết thúc của danh sách liên kết và tránh truy cập vào vùng nhớ không tồn tại.

Ví dụ khi khởi tạo một node mới:

Ví dụ về khởi tạo một node mới
Ví dụ về khởi tạo một node mới

Trong quá trình duyệt danh sách, ta thường kiểm tra điều kiện:

while (current != nullptr) {

    // xử lý node

    current = current->next;

}

Khi current bằng nullptr, điều đó có nghĩa là đã đi đến cuối danh sách.

Lưu ý: Bạn có thể thay kiểu int bằng float, string hoặc bất kỳ kiểu dữ liệu nào phù hợp với bài toán cần lưu trữ.

Tạo node đầu tiên và gán giá trị

Để khởi tạo một danh sách, bạn cần tạo node đầu tiên, thường gọi là head. Có thể gán giá trị ban đầu và khởi tạo con trỏ next trỏ đến nullptr:

Node* head = new Node();

head->data = 10;

head->next = nullptr;

Việc gán next = nullptr là rất quan trọng để đánh dấu node cuối cùng hoặc danh sách chỉ có 1 phần tử.

Thêm node mới vào danh sách

Sau khi đã có node đầu tiên, bạn có thể tạo các node tiếp theo và nối chúng bằng cách cập nhật con trỏ next:

Node* second = new Node();

second->data = 20;

second->next = nullptr;

head->next = second; // Liên kết node đầu với node thứ hai

Sau đoạn code này, bạn đã tạo được một danh sách liên kết đơn trong C++ gồm 2 phần tử.

Duyệt danh sách và in giá trị các node

Sau khi tạo danh sách, bạn có thể duyệt từng phần tử bằng vòng lặp while:

Node* current = head;

while (current != nullptr) {

    std::cout << current->data << ” “;

    current = current->next;

}

Việc tạo và thao tác với linked list C++ không khó, nhưng đòi hỏi sự cẩn thận khi làm việc với con trỏ để tránh lỗi bộ nhớ. Trong các phần tiếp theo, bạn sẽ được hướng dẫn chi tiết hơn về cách thêm, xóa và tìm kiếm node trong danh sách.

Danh sách liên kết đơn
Danh sách liên kết đơn

Khi nào nên dùng danh sách liên kết đơn trong C++?

Không phải lúc nào bạn cũng cần dùng danh sách liên kết đơn trong C++. Trên thực tế, việc lựa chọn cấu trúc dữ liệu phù hợp còn phụ thuộc vào mục tiêu sử dụng, hiệu suất mong muốn và đặc điểm của bài toán. Dưới đây là những trường hợp phổ biến khi linked list là lựa chọn ưu tiên hơn so với mảng (array):

  • Dữ liệu có kích thước thay đổi linh hoạt: Khi bạn không biết trước số lượng phần tử cần lưu, linked list cho phép thêm node mới dễ dàng mà không cần cấp phát lại bộ nhớ.
  • Cần thêm/xóa phần tử thường xuyên: Đặc biệt khi thao tác ở đầu hoặc giữa danh sách, linked list nhanh hơn mảng vì không cần dịch chuyển các phần tử còn lại.
  • Tối ưu bộ nhớ: Chỉ cấp phát bộ nhớ khi thực sự cần, tránh lãng phí như khi tạo mảng dư thừa dung lượng.
  • Xây dựng cấu trúc dữ liệu phức tạp: Là nền tảng để phát triển các cấu trúc như danh sách đôi, danh sách vòng, stack, queue, tree,…

Lỗi thường gặp khi dùng danh sách liên kết đơn trong C++ 

Khi học danh sách liên kết đơn trong C++, nhiều người nắm được lý thuyết nhưng lại gặp lỗi khi triển khai thực tế. Nguyên nhân chủ yếu đến từ việc xử lý con trỏ chưa chính xác hoặc chưa hiểu rõ cơ chế cấp phát bộ nhớ động. Dưới đây là những lỗi phổ biến nhất và cách khắc phục:

  • Quên giải phóng bộ nhớ sau khi xóa node

Danh sách liên kết đơn sử dụng cấp phát động (new). Nếu sau khi xóa node bạn không dùng delete, bộ nhớ sẽ không được thu hồi, lâu dài dẫn đến memory leak.
→ Giải pháp: Sau mỗi thao tác xóa, hãy đảm bảo giải phóng vùng nhớ đã cấp phát.

Dưới đây là ví dụ sai bạn thường gặp

Ví dụ sai thường gặp
Ví dụ sai thường gặp

Cách đúng:

Ví dụ đúng
Ví dụ đúng
  • Cập nhật con trỏ sai thứ tự khi chèn hoặc xóa

Khi thêm node vào giữa danh sách, nếu cập nhật next không đúng trình tự, bạn có thể làm mất liên kết của các node phía sau. Đây là lỗi rất dễ gặp với người mới.
→ Giải pháp: Trước khi viết code, hãy vẽ sơ đồ liên kết để hình dung rõ các bước thay đổi con trỏ.

  • Không kiểm tra danh sách rỗng trước khi thao tác

Nếu head đang là nullptr mà vẫn truy cập head->next, chương trình sẽ lỗi ngay lập tức.
→ Giải pháp: Luôn kiểm tra điều kiện danh sách rỗng trước khi thêm, xóa hoặc duyệt.

  • Sử dụng lại con trỏ đã bị delete

Sau khi giải phóng node, nếu vẫn tiếp tục truy cập con trỏ cũ, chương trình có thể gặp lỗi nghiêm trọng như segmentation fault.
→ Giải pháp: Sau khi delete, nên gán con trỏ về nullptr để tránh truy cập nhầm.

Việc nắm vững và tránh các lỗi trên sẽ giúp bạn sử dụng danh sách liên kết đơn trong C++ một cách an toàn, tối ưu và chuyên nghiệp hơn.

Học cấu trúc dữ liệu bài bản cùng Code Dream

Hiểu cấu trúc dữ liệu và vận dụng thành thạo trong C++ không chỉ giúp bạn viết chương trình chạy được, mà còn giúp bạn viết đúng – tối ưu – chuyên nghiệp. Tuy nhiên, để phát triển tư duy lập trình một cách bài bản, bạn cần một lộ trình rõ ràng, môi trường thực hành đủ sâu và người hướng dẫn sát sao.

Tại Trung tâm Tin học Code Dream, bạn sẽ được hướng dẫn bởi đội ngũ giáo viên có nhiều năm kinh nghiệm, am hiểu chuyên môn và phương pháp sư phạm hiện đại. Tiếp cận với giáo trình độc quyền – được xây dựng riêng bởi Code Dream, thiết kế tối ưu theo cấp độ và tư duy người học Việt Nam. 

  • Giáo trình độc quyền: Được biên soạn riêng theo lộ trình từ cơ bản đến nâng cao, bám sát thực tế học tập và nhu cầu tuyển dụng. Nội dung tập trung vào bản chất cấu trúc dữ liệu, cách lựa chọn và tối ưu trong từng bài toán cụ thể.
  • Lớp học thiên về thực hành: Tỷ lệ thực hành cao, hướng dẫn chi tiết từng bước phân tích bài toán, viết code và cải thiện hiệu năng. Học viên không chỉ nghe giảng mà trực tiếp “làm thật”.
  • Dạy tư duy, không chỉ dạy cú pháp: Mỗi buổi học đều rèn luyện khả năng phân tích, tư duy giải thuật và kỹ năng xử lý vấn đề – yếu tố tạo nên sự khác biệt giữa người biết code và lập trình viên giỏi.
  • Giáo viên đồng hành sát sao: Đội ngũ giáo viên nhiều năm kinh nghiệm luôn theo sát tiến độ học tập, giải đáp thắc mắc chi tiết và định hướng cách học hiệu quả.
Code Dream - Đào tạo lập trình bài bản
Code Dream – Đào tạo lập trình bài bản

Qua bài viết này, bạn đã nắm được kiến thức quan trọng về danh sách liên kết đơn trong C++ – từ khái niệm, cấu trúc node, cách khai báo, thao tác với danh sách đến khi nào nên sử dụng cấu trúc này trong thực tế. Đây là một trong những nền tảng quan trọng nhất để bước vào lĩnh vực cấu trúc dữ liệu và giải thuật, kỹ năng thiết yếu trong lập trình chuyên sâu. Ghé thăm website chính thức: https://codedream.edu.vn để khám phá ngay các khóa học C++ và lộ trình lập trình chuyên sâu dành riêng cho bạn!

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *