Ôn tập: xây dựng danh sách liên kết
Thuộc phần Lập trình hướng đối tượng trong hành trình GO của Coddy. Bài học 24 trên 107.
Thử thách
DễHãy tự xây dựng một danh sách liên kết nhé! Bạn sẽ tạo một cấu trúc dữ liệu trong đó mỗi nút trỏ đến nút tiếp theo, tạo thành một chuỗi các giá trị liên kết với nhau trong bộ nhớ.
Bạn sẽ sắp xếp code trong hai tệp:
linkedlist.go: Định nghĩa một cấu trúcNodevới các trườngValue(int) vàNext(*Node). Tạo cấu trúcLinkedListlưu con trỏ đến nútHead. Cài đặt các phương thức sau cho*LinkedList:Append- thêm một nút mới có giá trị đã cho vào cuối danh sáchPrepend- thêm một nút mới có giá trị đã cho vào đầu danh sáchPrint- duyệt danh sách và in ra tất cả giá trị, ngăn cách bằng->, kết thúc bằngnil
main.go: Đọc các giá trị từ đầu vào, tạo danh sách liên kết bằng cách thêm nút vào cuối và đầu danh sách, sau đó in ra cấu trúc danh sách cuối cùng.
Đầu vào sẽ gồm các giá trị sau:
- Dòng 1: Giá trị đầu tiên cần thêm vào cuối danh sách
- Dòng 2: Giá trị thứ hai cần thêm vào cuối danh sách
- Dòng 3: Giá trị cần thêm vào đầu danh sách
Phương thức Print của bạn cần in ra danh sách theo định dạng sau:
[value1] -> [value2] -> [value3] -> nilVí dụ, với các giá trị 10, 20 và 5, kết quả cần in ra là:
5 -> 10 -> 20 -> nilPhương thức Append cần duyệt đến cuối danh sách, nơi Next là nil, rồi mới thêm nút mới. Phương thức Prepend cần tạo một nút mới, cho Next của nút đó trỏ đến nút đầu hiện tại, rồi cập nhật nút đầu thành nút mới. Hãy nhớ rằng danh sách rỗng có nút đầu là nil, vì vậy hãy xử lý trường hợp đó trong phương thức Append.
Tự làm thử
package main
import "fmt"
func main() {
// Đọc các giá trị đầu vào
var val1, val2, val3 int
fmt.Scanln(&val1)
fmt.Scanln(&val2)
fmt.Scanln(&val3)
// Tạo một danh sách liên kết mới
list := &LinkedList{}
// TODO: Dùng Append để thêm val1 và val2 vào danh sách
// TODO: Dùng Prepend để thêm val3 vào đầu danh sách
// TODO: In ra cấu trúc cuối cùng của danh sách
}
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng OOP trong Go
Tệp bên ngoàiWorkspace và module trong GoPackage và importTên được export và không được exportGiới thiệu về OOP trong GoStruct như lớpĐịnh nghĩa phương thức cho structReceiver kiểu con trỏ và kiểu giá trịKhởi tạo structHàm khởi tạoÔn tập: máy tính đơn giản4Interface
Giới thiệu về interfaceTriển khai ngầm địnhInterface như một hợp đồngInterface rỗng (any)Khẳng định kiểuswitch kiểuKết hợp interfaceInterface Stringer và ErrorÔn tập: Máy tính hình học7Tính đóng gói
Trường được xuất và không được xuấtĐóng gói ở cấp packagePhương thức getter và setterẨn thông tin trong GoÔn tập: hồ sơ học sinh10Generics (Go 1.18 trở lên)
Giới thiệu về GenericsTham số kiểuRàng buộc kiểuStruct tổng quátGiải pháp thay thế cho phương thức tổng quátÔn tập: tập hợp tổng quát13Các mẫu thiết kế phần 1
Giới thiệu về mẫu thiết kếMẫu SingletonMẫu FactoryMẫu Abstract FactoryMẫu ObserverMẫu Strategy2Tìm hiểu chuyên sâu về kiểu dữ liệu và struct
Kiểu cơ bản và kiểu tổng hợpĐịnh nghĩa kiểu dữ liệu tùy chỉnhThẻ structStruct ẩn danhStruct lồng nhauGiá trị zero và giá trị mặc địnhÔn tập: sổ liên lạc5Ưu tiên kết hợp hơn kế thừa
Vì sao Go không có kế thừaNhập môn nhúng structTự động nâng phương thứcNhúng nhiều structNhúng và kết tậpChe khuất phương thức được nhúngÔn tập: hệ phân cấp nhân viên8Xử lý lỗi và lập trình hướng đối tượng
Giao diện errorCác kiểu lỗi tùy chỉnhBọc lỗi với fmt.ErrorfLỗi sentinelerrors.Is() và errors.As()Panic, defer và recoverÔn tập: trình phân tích tệp3Con trỏ và bộ nhớ
Cơ bản về con trỏ trong GoCon trỏ đến structTruyền theo giá trị và tham chiếuHàm new()Thu gom rác trong GoÔn tập: xây dựng danh sách liên kết6Đa hình trong Go
Đa hình qua interfaceĐịnh kiểu vịt trong GoQuy tắc thỏa mãn interfaceCác tập hợp đa hìnhTiêm phụ thuộcÔn tập: bộ xử lý thanh toán9Lập trình đồng thời và lập trình hướng đối tượng
Cơ bản về goroutineChannel và giao tiếpChannel có bộ đệm và không có bộ đệmCâu lệnh selectsync.Mutex và sync.RWMutexsync.WaitGroupThiết kế struct an toàn luồngÔn tập: worker poolTự luyện tập: Trình biên dịch Go online