LeetCode 92 Đảo ngược danh sách liên kết II - 789bet dang nhap

| Apr 27, 2025 min read

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
}

Hình ảnh minh họa

#Golang #Thuật_toán