You are on page 1of 52

CIRCULAR LINKED LISTS

AND
DOUBLE LINKED LISTS
NHÓM 4
• Hồ Thái Long
Danh sách • Nguyễn Tường Phương Uyên
thành viên • Phan Công Tú
• Nguyễn Anh Khoa
NỘI DUNG

CIRCULAR LINKED DOUBLY LINKED LISTS. COMPARISON OF ARRAY


LISTS. WITH LINKED LIST.
NHẮC LẠI BÀI CŨ

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

head 5 6 7 9 /

Thêm
Xóa
Sửa
Tìm kiếm

CIRCULAR LINKED LISTS.
head 5 6 7 9 X

head 5 6 7 9

head 5

 Việc triển khai danh sách liên kết vòng rất dễ dàng và gần giống với việc triển khai danh
sách liên kết đơn, với điểm khác biệt duy nhất là, trong danh sách liên kết vòng, Nút cuối
cùng sẽ trỏ tới node Đầu danh sách. Trong danh sách liên kết đơn, Node cuối cùng chỉ là
NULL.
CIRCULAR LINKED LISTS.

 Ứng dụng thực tế nơi danh sách liên kết vòng được sử dụng là Máy tính cá nhân, nơi
nhiều ứng dụng đang chạy cùng lúc. Tất cả các ứng dụng đang chạy được giữ trong
một danh sách liên kết tròn và hệ điều hành cung cấp một khoảng thời gian cố định
cho tất cả các ứng dụng đang chạy. Hệ điều hành tiếp tục lặp lại danh sách được liên
kết cho đến khi tất cả các ứng dụng được hoàn thành.
 Một ví dụ khác có thể là trò chơi Nhiều người chơi. Tất cả Người chơi được lưu giữ
trong Danh sách liên kết hình tròn và con trỏ tiếp tục di chuyển về phía trước khi cơ
hội của người chơi kết thúc.
IN DANH SÁCH LIÊN KẾT VÒNG

head 5 6 7 9
THÊM MỘT NODE TRONG DANH SÁCH LIÊN KẾT VÒNG

 Thêm một Node

head 5 6 7 9

9 /

Ta muốn thêm node có giá trị bằng 9 vị trí 2 trong danh sách liên
kết vòng trên
THÊM MỘT NODE TRONG DANH SÁCH LIÊN KẾT VÒNG

 Thêm một Node


p

head 5 6 7 9

P = head
THÊM MỘT NODE TRONG DANH SÁCH LIÊN KẾT VÒNG

 Thêm một Node


p

head 5 6 7 9

for(i=0;i<index-1;i++)
p=p->next;
THÊM MỘT NODE TRONG DANH SÁCH LIÊN KẾT VÒNG

Thêm một Node p

head 5 6 7 9

t->data=x;
t->next=p->next;
p->next=t;
THÊM MỘT NODE TRONG DANH SÁCH LIÊN KẾT VÒNG

 Thêm một Node

head 5 6 7 9

9
THÊM MỘT NODE VÀO ĐẦU DANH

head 5 6 7 9

9
THÊM MỘT NODE VÀO ĐẦU DANH

head 5 6 7 9

9
while(p->next!=Head)p=p->next;
p->next=t;
t->next=Head;
Head=t;
XOÁ MỘT NODE TRONG DANH SÁCH LIÊN KẾT
VÒNG

 Xoá node ở đầu


 Xoá node ở vị trí bất kì

head 5 6 7 9
XOÁ NODE Ở ĐẦU
p

head 5 6 7 9

head 5 6 7 9
XOÁ NODE Ở ĐẦU

head 5 6 7 9

p->next=Head->next;
XOÁ NODE Ở ĐẦU

head 6 7 9

Delete Head;
Head = p->next;
XOÁ NODE Ở VỊ TRÍ BẤT KÌ

Xoá node ở vị trí số 3


p

head 5 6 3 7 9

p q
for(i=0;i<index-1;i++)
p=p->next;
head 5 6 3 7 9
q = p->next;
XOÁ NODE Ở VỊ TRÍ BẤT KÌ

Xoá node ở vị trí số 3


p q

head 5 6 3 7 9

p->next = q->next;
XOÁ NODE Ở VỊ TRÍ BẤT KÌ

Xoá node ở vị trí số 3

head 5 6 3 9

head 5 6 3 9

delete q;
SẮP XẾP TRONG DANH SÁCH LIÊN KẾT
VÒNG

int arr[] = { 12, 56, 2, 11, 1, 90 };


Node* start = NULL;
Node* temp;

for (i = 0; i < 6; i++)


{
temp = new Node();
temp->data = arr[i];
sortedInsert(start, temp);
}
SẮP XẾP TRONG DANH SÁCH LIÊN KẾT
VÒNG

int arr[] = { 12, 56, 2, 11, 1, 90 };

Case 1: *head == NULL


if (current == NULL)
head 12 {
new_node->next = new_node;
head_ref = new_node;
}
SẮP XẾP TRONG DANH SÁCH LIÊN KẾT
VÒNG
int arr[] = { 12, 56, 2, 11, 1, 90 };
Case 2: Locate the node before the point of
insertion
else if (current->data < new_node->data)
{while (current->next != head_ref &&
head current->next->data < new_node->data)
12
current = current->next;

new_node->next = current->next;
current->next = new_node;
}

head 12 56
SẮP XẾP TRONG DANH SÁCH LIÊN KẾT
VÒNG
int arr[] = { 12, 56, 2, 11, 1, 90 };
Case 3: If value is smaller than head's
value then we need to change next of last
head 12 56 node

else if (current->data >= new_node->data)


head
{
2 12 56 while (current->next != head_ref)
current = current->next;
current->next = new_node;
new_node->next = head_ref;
head_ref = new_node;
head 2 12 56 }
SẮP XẾP TRONG DANH SÁCH LIÊN KẾT
VÒNG
DANH SÁCH LIÊN KẾT ĐÔI

head

/ 5 6 7 9 /
THÊM MỘT NODE TRONG DANH SÁCH LIÊN
KẾT ĐÔI

Thêm ở
Thêm ở vị
đầu danh
trí bất kì
sách
THÊM Ở ĐẦU DANH SÁCH

p P = new Node;
p->data = x;
p->prev = NULL;
/ x

head

/ 5 6 7 9 /
THÊM Ở ĐẦU DANH SÁCH

/ x p->next = head;

head

/ 5 6 7 9 /
THÊM Ở ĐẦU DANH SÁCH

p
head->prev = p;
head = p;
/ x

head

5 6 7 9 /
THÊM Ở ĐẦU DANH SÁCH

head

/ x 5 6 7 9 /
THÊM Ở VỊ TRÍ BẤT KÌ

Thêm ở vị trí thứ 2

head / 5 6 7 9 /

head / 5 6 7 9 /

for(i=0; I < index-1; i++)


P = p->next;
THÊM Ở VỊ TRÍ BẤT KÌ
Thêm ở vị trí thứ 2

head / 5 6 7 9 /

T = new Node;
t->data = x;
t->prev = p;
t->next=p->next;
THÊM Ở VỊ TRÍ BẤT KÌ
Thêm ở vị trí thứ 2

x
p

head / 5 6 7 9 /

if(p->next)
p->next->prev=t;
p->next = t;
THÊM Ở VỊ TRÍ BẤT KÌ
Thêm ở vị trí thứ 2

head / 5 6 x 7 9 /
THÊM Ở VỊ TRÍ BẤT KÌ
Thêm ở vị trí thứ 2

head

/ 5 6 7 9 /

head / 5 6 x 7 9 /
XOÁ MỘT NODE TRONG DANH SÁCH
LIÊN KẾT ĐÔI

Xoá node
Xoá node
ở vị trí bất
ở đầu

XOÁ NODE Ở ĐẦU

head / 5 6 8 7 9 /

head

/ 6 8 7 9 /
 p = head;
 head =head->next;
 if(head)
head / 5 /
 head ->prev = NULL;
 delete p;
XOÁ NODE Ở VỊ TRÍ BẤT KÌ
 Xoá node thứ 3

head / 5 6 8 7 9 /

head / 5 6 8 7 9 /

for(i=0;i<index;i++)
p=p->next;
XOÁ NODE Ở VỊ TRÍ BẤT KÌ

head / 5 6 8 7 9 /

p->prev->next = p->next;
if(p->next)
p->next->prev = p->prev;
XOÁ NODE Ở VỊ TRÍ BẤT KÌ

head / 5 6 8 9 /

head / 5 6 8 9 /

Delete p;
Liên kết đôi

Liên kết vòng


SORT

 Merge sort is often preferred for


sorting a linked list. The slow
random-access performance of a
linked list makes some other
algorithms (such as quicksort)
perform poorly, and others (such as
heapsort) completely impossible.
SẮP XẾP TRONG DANH SÁCH LIÊN
KẾT VÒNG

Array List
SẮP XẾP TRONG DANH SÁCH LIÊN KẾT ĐÔI

/ 5 2 8 7 9 /

first

/ 5 2 8 /

second

7 9 /
SẮP XẾP TRONG DANH SÁCH LIÊN KẾT ĐÔI
SẮP XẾP TRONG DANH SÁCH LIÊN KẾT ĐÔI

first second

/ 6 /
/ 5 8 /

/ 6 8 /

/ 5 / 6 8 /
DANH SÁCH LIÊN KẾT VÒNG ĐÔI

head 5 6 8 9
SO SÁNH
TÀI LIỆU THAM KHẢO

 https://www.geeksforgeeks.org/merge-sort-for-doubly-linked-list/
 https://www.geeksforgeeks.org/sorted-insert-for-circular-linked-list/
 Soure code from: Abdul Bari
BÀI THUYẾT TRÌNH ĐẾN ĐÂY LÀ KẾT THÚC
CẢM ƠN CÁC BẠN VÀ THẦY ĐÃ LẮNG NGE

You might also like