Danh sách liên kết đôi

Danh sách liên kết đôi (Doubly Linked List) là một biến thể của danh sách liên kết (Linked List), trong đó hoạt động duyệt qua các nút có thể được thực hiện theo hai chiều: về trước và về sau một cách dễ dàng khi so sánh với Danh sách liên kết đơn. Dưới đây là một số khái niệm quan trọng cần ghi nhớ về Danh sách liên kết đôi.

  • Link: mỗi link của một Danh sách liên kết có thể lưu giữ một dữ liệu và được gọi là một phần tử.
  • Next: mỗi link của một Danh sách liên kết có thể chứa một link tới next link và được gọi là Next.
  • Prev: mỗi link của một Danh sách liên kết có thể chứa một link tới previous link và được gọi là Prev.
  • First và Last: một Danh sách liên kết chứa link kết nối tới first link được gọi là First và tới last link được gọi là Last.

Minh họa danh sách liên kết đôi

 

Theo minh họa ở trên, sau đây là những điểm quan trọng cần được xem xét.

  • Danh sách liên kết đôi có chứa một phần tử liên kết(link), được gọi đầu tiên(first) và cuối cùng(last).
  • Mỗi liên kết mang (các) trường dữ liệu và hai trường liên kết được gọi là tiếp theo(next) và trước(prev).
  • Mỗi liên kết được liên kết với liên kết tiếp theo bằng next link.
  • Mỗi liên kết được liên kết với liên kết trước đó bằng prev link.
  • Liên kết cuối cùng mang một liên kết là null để đánh dấu phần cuối của danh sách.

Hoạt động cơ bản

Sau đây là các hoạt động cơ bản được hỗ trợ bởi một danh sách.

  • Chèn - Thêm một phần tử ở đầu danh sách.
  • Xóa - Xóa một phần tử ở đầu danh sách.
  • Chèn vào cuối - Thêm một phần tử vào cuối danh sách.
  • Xóa phần tử cuối - Xóa một phần tử ở vị trí cuối danh sách.
  • Chèn vào sau - Thêm một phần tử sau một phần tử của danh sách.
  • Xóa (bởi key) - Xóa một phần tử khỏi danh sách bằng phím.
  • Hiển thị danh sách về phía trước - Hiển thị danh sách đầy đủ theo chiều về phía trước.
  • Hiển thị danh sách về phía sau - Hiển thị danh sách đầy đủ theo chiều về phía sau.

Thao tác chèn

Đoạn mã sau biểu thị thao tác chèn vào đầu danh sách liên kết đôi.

Thí dụ

//insert link at the first location
void insertFirst(int key, int data) {
   //create a link
   struct node *link = (struct node*) malloc(sizeof(struct node));
   link->key = key;
   link->data = data;             
   if(isEmpty()) {
      //make it the last link
      last = link;
   } else {
      //update first prev link
      head->prev = link;
   }
   //point it to old first link
   link->next = head;     
   //point first to new first link
   head = link;
}

Thao tác xóa

Đoạn mã sau biểu thị thao tác xóa ở đầu danh sách liên kết đôi.

Thí dụ

//delete first item

struct node* deleteFirst() {

   //save reference to first link

   struct node *tempLink = head;              

   //if only one link

   if(head->next == NULL) {

      last = NULL;

   } else {

      head->next->prev = NULL;

   }              

   head = head->next;            

   //return the deleted link

   return tempLink;

}

Chèn vào cuối danh sách liên kết đôi

Đoạn mã sau biểu thị thao tác chèn tại vị trí cuối cùng của danh sách liên kết đôi.

Thí dụ

//insert link at the last location

void insertLast(int key, int data) {

   //create a link

   struct node *link = (struct node*) malloc(sizeof(struct node));

   link->key = key;

   link->data = data;            

   if(isEmpty()) {

      //make it the last link

      last = link;

   } else {

      //make link a new last link

      last->next = link;          

      //mark old last node as prev of new link

      link->prev = last;

   }

   //point last to new last node

   last = link;

}

- Hiếu Kiều -