Chương 4. Danh sách liên kết – Phần 2
Trần Minh Thái
Email:
Website: www.minhthai.edu.vn
Cập nhật: ngày 30 tháng 10 năm 2016
Nội dung
Sinh viên sẽ được trình bày, hiểu và vận dụng vào lập trình một số kỹ thuật sau để xử lý trên DSLK
đơn:
1.
2.
3.
Chèn thêm một node
Xoá một node
Sắp xếp
2
Chèn node vào DSLK đơn
Chèn vào sau node p
Chèn vào trước node p
25
pNew
p
list
pHead
pTail
3
Chèn node vào sau node p
pNew
p
list
pHead
pTail
4
Chèn node vào sau node p
Input: DSLK list, node p và node cần thêm pNew
Output: list sau khi thêm pNew vào sau p
Algorithm:
B1: Nếu p là pTail của list thì
Thêm pNew vào cuối list: Kết thúc
B2: pSau = p.pNext
Nối pNew vào pSau
Nối p vào pNew
5
?
Cài đặt phương thức thêm pNew vào sau p
public void InsertAfterP(Node<T> p, Node<T> pNew)
{
}
6
Chèn node vào trước node p – Cách 1
pPrev
p
list
pHead
pTail
7
pNew
Tìm node trước node p
Input: DSLK list, node p
Output: node phía trước node p: pTruoc (nếu khơng có node trước p thì trả về null)
Algorithm:
B1: Nếu p là pHead của list thì
Trả về null: Kết thúc
B2: pTruoc = pHead của list
B3: Trong khi node sau của pTruoc khác p thực hiện
pTruoc = node sau của pTruoc
B4: Trả về pTruoc
8
?
Cài đặt phương thức tìm node trước node p
public Node<T> PrevNodeP (Node<T> p)
{
}
9
Chèn node pNew vào trước node p
Input: DSLK list, node p, node cần thêm pNew
Output: list sau khi thêm pNew vào trước node p (trả về true nếu chèn thành công, ngược lại trả
về false)
Algorithm:
B1: Nếu p là pHead của list thì
Thêm pNew vào đầu list trả về true: Kết thúc
B2: pTruoc = Tìm node trước p
B3: Nếu pTruoc = null trả về false: Kết thúc
B4: pTruoc nối với pNew
pNew nối với node sau của p
trả về true
10
?
Cài đặt phương thức thêm pNew vào trước node p – Cách 1
public bool InsertBeforeP1 (Node<T> p, Node<T> pNew)
{
}
11
Chèn node vào trước node p – Cách 2
Bước 1. Chèn pNew vào sau p
Bước 2. Hoán vị giá trị pNew và p
pNew
p
list
pHead
pTail
12
?
Cài đặt phương thức thêm pNew vào trước node p – Cách 2
public bool InsertBeforeP2 (Node<T> p, Node<T> pNew)
{
}
13
Xóa một node trong danh sách
TH1: Xóa node đầu của danh sách Ảnh hưởng pHead
TH2: Xóa node cuối của danh sách Ảnh hưởng pTail
TH còn lại: Xoá node bên trong danh sách
14
Xóa một nút trong danh sách
TH1: Xóa nút đầu của danh sách
Cần xóa
30
list
pHead
25
41
pTail
pDel
15
78
Xoá node đầu của DSLK
Input: DSLK list
Output: list sau khi xố node đầu
Algorithm:
B1: Nếu list có pHead = pTail thì
pHead = pTail = null: Kết thúc
B2: Cập nhật pHead là node sau của pHead
16
?
Cài đặt phương thức xoá node đầu DSLK
public void DeleteHead ()
{
}
17
Xóa một node trong danh sách
TH 2: Xóa node cuối của danh sách
Cần xóa
pPrev
30
list
pHead
25
41
pTail
18
pDel
78
Xoá node cuối trong danh sách
Input: DSLK list
Output: list sau khi xoá node cuối
Algorithm:
B1: Nếu list có pHead = pTail thì
pHead = pTail = null: Kết thúc
B2: pTruoc = node trước pTail của list
pTail = null
pTail = pTruoc
19
?
Cài đặt phương thức xoá node cuối DSLK
public void DeleteTail ()
{
}
20
Xóa một node trong danh sách
TH cịn lại: Xóa node bên trong danh sách
Cần xóa
30
list
pHead
pPrev
pDel
25
41
96
pTail
21
78
Xoá node pDel bên trong DSLK
Input: DSLK list, node pDel
Output: list sau khi xoá node pDel
Algorithm:
B1: pTruoc = node trước node pDel
B2: pTruoc nối với node sau của pDel
B3: pDel = null
Đoạn code bằng C#?
22
Xoá 1 node pDel bất kỳ của DSLK
Input: DSLK list, node pDel
Output: list sau khi xoá node pDel
Algorithm:
B1: Nếu pDel là pHead của list thì gọi DeleteHead(), kết thúc
B2: Ngược lại nếu pDel là pTail của list thì gọi DeleteTail(), kết thúc
B3: 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
23
?
Cài đặt phương thức xoá 1 node pDel bất kỳ trong DSLK
public void DeleteNode (Node<T> pDel)
{
}
24
Bài tập tại lớp
Định nghĩa các phương thức theo yêu cầu sau:
1. Chèn node có giá trị x vào phía sau node có giá trị lớn nhất (giả sử danh sách khơng có
giá trị trùng nhau)
2. Xóa node có giá trị x xuất hiện đầu tiên trong danh sách (nếu có xóa: trả về true, ngược
lại trả về false)
3. Sắp DSLK theo thứ tự tăng dần (dùng phương pháp chọn trực tiếp)
25