Ngày 25 f8bet72 tháng 07 năm 2020 game bài tặng 50k - Máy tính
1. Mô tả bài toán
Đảo ngược một đoạn của danh sách liên kết đơn (bắt đầu từ vị trí thứ m đến vị trí thứ n).
Ví dụ:
Đầu vào: 1->2->3->4->5->NULL, m = 2, n = 4
Đầu ra: 1->4->3->2->5->NULL
Lưu ý: 1 ≤ m ≤ n ≤ độ dài danh sách liên kết.
Nguồn gốc bài toán: LeetCode
2. Cách tiếp cận giải quyết
Cách thực hiện phần đảo ngược có thể tham khảo cách giải của bài trước là LeetCode 206 Đảo ngược danh sách liên kết. Độ khó bổ sung của bài này nằm ở việc phải tìm được vị trí bắt đầu của đoạn cần đảo ngược (di chuyển m-1 bước và ghi nhớ nút cuối cùng của phần bên trái trong danh sách ban đầu để tiện kết nối sau khi đã đảo ngược). Sau đó di chuyển thêm n-m bước đồng thời áp dụng phương pháp đảo ngược tương tự như bài trước cho đoạn này. Cuối cùng, kết nối phần bên trái của danh sách ban đầu với phần đầu của đoạn đã đảo ngược và Rik66 Club Game Bài 52Play phần đuôi của đoạn đã đảo ngược với phần đầu của phần bên phải của danh sách ban đầu để thu được kết quả mong muốn.
3. Mã nguồn thực hiện bằng Golang
func reverseBetween(head *ListNode, m int, n int) *ListNode {
if head == nil || head.Next == nil || m == n {
return head
}
// Tính số bước cần thực hiện
buoc := n - m
// Tìm vị trí bắt đầu
var traiCuoi *ListNode
p := head
for m > 1 {
traiCuoi = p
p = p.Next
m--
}
// Thực hiện đảo ngược
q := p.Next
p.Next = nil
giuaCuoi := p
for buoc > 0 {
r := q.Next
q.Next = p
p = q
q = r
buoc--
}
// Kiểm tra xem có phần bên trái không?
if traiCuoi == nil {
giuaCuoi.Next = q
return p
}
traiCuoi.Next = p
giuaCuoi.Next = q
return head
}
#Golang #Thuật_toán