You are on page 1of 10

01/09/2021

Nội dung

Sinh viên sẽ được trình bày, hiểu và vận dụng vào lập
Bài 5: Danh sách liên kết trình một số kỹ thuật sau để xử lý trên DSLK đơn:
– Phần 2 1. Chèn thêm một node

2. Xoá một node


TS. Trần Minh Thái - minhthai@huflit.edu.vn
3. Sắp xếp

2
Cập nhật: ngày 20 tháng 10 năm 2020

1 2

Chèn node vào DSLK đơn Chèn node vào sau node p

▪ Chèn vào sau node p


25
▪ Chèn vào trước node p
p pNew p pNew

list list
first last 3
first last 4

3 4
1
01/09/2021

?
Chèn node vào sau node p Cài đặt phương thức thêm pNew vào sau p
public void InsertAfterP(Node<T> p, Node<T> newNode)
▪ Input: DSLK list, node p và node cần thêm pNew {
▪ Output: list sau khi thêm pNew vào sau p if (p == last)
▪ Algorithm: InsertLast(newNode);
else
Nếu p là last của list thì
{
Thêm pNew vào cuối list: Kết thúc Node<T> pSau = p.Next;
Ngược lại: newNode.Next = pSau;
pSau = p.pNext p.Next = newNode;
}
Nối pNew vào pSau
}
Nối p vào pNew

5 6

5 6

Bài tập Chèn node vào trước node p – Cách 1

Cho danh sách liên kết số nguyên, cài đặt


phương thức:
1. Chèn phần tử có giá trị x vào phía sau phần pPrev p pNew
tử nhỏ nhất
2. Chèn x vào sau phần tử có giá trị y xuất
hiện đầu tiên. Nếu không có y thì chèn vào
đầu danh sách

list
7
first last 8

7 8
2
01/09/2021

? Cài đặt phương thức tìm node trước node p


Tìm node trước node p
public Node<T> PrevNodeP (Node<T> p)
▪ Input: DSLK list, node p {
▪ Output: node phía trước node p: pTruoc (nếu không có if (p == first)
node trước p thì trả về null) return null;
▪ Algorithm: Node<T> pTruoc = first;
▪ B1: Nếu p là first của list thì while (pTruoc.Next != p)
Trả về null: Kết thúc pTruoc = pTruoc.Next;
▪ B2: pTruoc = first của list
▪ B3: Trong khi node sau của pTruoc khác p thực hiện return pTruoc;
}
pTruoc = node sau của pTruoc
▪ B4: Trả về pTruoc

9 10

9 10

? Cài đặt phương thức thêm pNew vào trước


Chèn node pNew vào trước node p node p – Cách 1
▪ Input: DSLK list, node p, node cần thêm pNew public void InsertBeforeP1 (Node<T> p, Node<T> pNew)
▪ Output: list sau khi thêm pNew vào trước node p {
▪ Algorithm: Node<T> pTruoc = PrevNodeP(p);
▪ B1: pTruoc = Tìm node trước p if (pTruoc == null)
{
▪ B2: Nếu pTruoc = null InsertFirst(newNode);
Thêm pNew vào đầu list trả về true: Kết thúc }
▪ B3: Ngược lại else
pTruoc nối với pNew {
pTruoc.Next = newNode;
pNew nối với p newNode.Next = p;
}
11
} 12

11 12
3
01/09/2021

Chèn node vào trước node p – Cách 2


? Cài đặt phương thức thêm pNew vào trước
node p – Cách 2
Bước 1. Chèn pNew vào sau p void HoanVi(Node<T> a, Node<T> b)
Bước 2. Hoán vị giá trị pNew và p {
<T>tam=a.Data;
a.Data=b.Data;
p pNew
b.Data=tam;
}
public void InsertBeforeP2 (Node<T> p, Node<T> pNew)
{
InsertAfterP(p, pNew);
HoanVi(p, pNew);
}

list
first last 13 14

13 14

Bài tập Xóa một node trong danh sách

▪ TH1: Xóa node đầu của danh sách → Ảnh hưởng first
Viết phương thức chèn node có giá trị x vào
trước node có giá trị nhỏ nhất trong danh sách ▪ TH2: Xóa node cuối của danh sách → Ảnh hưởng last
liên kết đơn số nguyên
▪ TH còn lại: Xoá node bên trong danh sách

15 16

15 16
4
01/09/2021

Xóa một nút trong danh sách


Xoá node đầu của DSLK
▪ TH1: Xóa nút đầu của danh sách
▪ Algorithm: RemoveFirst
▪ Input: DSLK list
Cần xóa
▪ Output: list sau khi xoá node đầu (trả về true)
▪ Algorithm:
▪ B1: Nếu list rỗng thì trả về false: Kết thúc
list 30 25 41 78 ▪ B2: del = first
first last first = del.Next
pDel Xóa del
▪ B3: Nếu first == null thì
last = null
▪ B4: Trả về true
17 18

17 18

? Xóa một node trong danh sách


Cài đặt phương thức xoá node đầu DSLK
▪ TH 2: Xóa node cuối của danh sách
public bool RemoveFirst()
{
Cần xóa
pPrev pDel

list 30 25 41 78
first last

}
19 20

19 20
5
01/09/2021

?
Xoá node cuối trong danh sách Cài đặt phương thức xoá node cuối DSLK
▪ Algorithm: RemoveLast
▪ Input: DSLK list public bool RemoveLast()
▪ Output: list sau khi xoá node cuối (trả về true) {
▪ Algorithm:
▪ B1: Nếu list rỗng thì trả về false: Kết thúc
▪ B2: Nếu first = last thì RemoveFirst()
Ngược lại
pTruoc = node trước last của list
pTruoc.Next=null
last = null
last = pTruoc }
▪ B3: Trả về true 21 22

21 22

Xóa một node trong danh sách


Xoá node pDel bên trong DSLK – Cách 1
▪ TH còn lại: Xóa node bên trong danh sách – Cách 1
▪ Input: DSLK list, node pDel
▪ Output: list sau khi xoá node pDel
Cần xóa
▪ Algorithm:
pPrev pDel ▪ B1: pTruoc = node trước node pDel
▪ B2: pTruoc nối với node sau của pDel
30 25 41 96 78 ▪ B3: pDel = null
list
first last

Đoạn code bằng C#?


23 24

23 24
6
01/09/2021

Xoá 1 node pDel bất kỳ của DSLK – ? Cài đặt phương thức xoá 1 node pDel bất kỳ
Cách 1 trong DSLK theo cách 1
▪ Algorithm: DeleteNode1 public bool DeleteNode1(Node<T> pDel)
▪ Input: DSLK list, node pDel {
▪ Output: list sau khi xoá node pDel (trả về true)
▪ Algorithm:
▪ B1: Nếu list rỗng thì trả về false
▪ B2: Nếu pDel là first thì trả về RemoveFirst()
▪ B3: Nếu pDel là last thì trả về RemoveLast()
▪ B4: Ngược lại tìm node pTruoc là node trước pDel
pTruoc nối với node sau của pDel
pDel = null }
Trả về true 25 26

25 26

Xóa một nút trong danh sách Xóa một nút trong danh sách
▪ Xóa nút giữa của danh sách – Cách 2 ▪ Xóa nút giữa của danh sách – Cách 2
Cần Cần
xóa xóa
pDel pSau pDel pSau

list 30 25 41 96 78 list 30 25 96 41 78
first last first last

pSau = pDel.Next Hoán vị giá trị pDel với pSau

27 28

27 28
7
01/09/2021

Xóa một nút trong danh sách Xóa một nút trong danh sách
▪ Xóa nút giữa của danh sách – Cách 2 ▪ Xóa nút giữa của danh sách – Cách 2
Cần Cần
xóa xóa
pDel pSau pDel pSau

list 30 25 96 41 78 list 30 25 96 41 78
first last first last

pDel.Next = pSau.Next Xóa pSau

29 30

29 30

? Cài đặt phương thức xoá 1 node pDel bất kỳ


Xoá 1 node pDel bất kỳ của DSLK
trong DSLK theo cách 2
▪ Algorithm: DeleteNode2
▪ Input: DSLK list, node pDel public bool DeleteNode2(Node<T> pDel)
{
▪ Output: list sau khi xoá node pDel (trả về true)
▪ Algorithm:
▪ B1: Nếu list rỗng thì trả về false
▪ B2: Nếu pDel=Last thì trả về RemoveLast()
▪ B3: pSau=pDel.Next
▪ B4: Hoán vị giá trị pSau và pDel
▪ B5: Nối pDel với pSau.Next
Xóa pSau }
Trả về true 31 32

31 32
8
01/09/2021

Bài tập
Sắp xếp
Cho DSLK đơn số nguyên, định nghĩa các phương ▪ Algorithm: Sort
thức theo yêu cầu sau: ▪ Input: DSLK list
▪ Output: list có giá trị tăng dần
1. Xóa node có giá trị x xuất hiện đầu tiên trong danh ▪ Algorithm:
sách (nếu có xóa: trả về true; ngược lại trả về false) ▪ B1: p = First
▪ B2: Tìm node pMin có giá trị nhỏ nhất từ p đến
2. Sắp DSLK theo thứ tự tăng dần (dùng phương cuối danh sách
▪ B3: Hoán vị giá trị p và pMin
pháp chọn trực tiếp) ▪ B4: p=p.Next
▪ B5: Nếu p=last thì kết thúc
Ngược lại quay lại B2
33 34

33 34

?
Cài đặt hàm sắp xếp tăng DSLK số nguyên Cài đặt hàm SX theo pp Đổi chỗ TT
public void HoanVi(IntNode a, IntNode b)
{ public void InterchangeSort()
} {
public IntNode TimMin(IntNode p)//Tìm min từ p đến cuối
{
}
}
public void Sort()
{

35 36

35 36
9
01/09/2021

Bài tập
Sử dụng lại lớp DSLK đơn (MyLinkedList), bổ sung các
phương thức:
1. Khi nhập dữ liệu vào danh sách sẽ tìm tự động vị trí thích
hợp để chèn vào nhằm đảm bảo có thứ thự tăng dần dựa
vào khóa so sánh bất kỳ
2. Bổ sung các phương thức xoá node
3. Phương thức sắp xếp theo thứ tự tăng dần dựa vào khoá so
sánh bất kỳ

37

37 38

10

You might also like