Chuyển đến nội dung chính

Bài 24 Leetcode: Swap Nodes in Pairs

Đề bài:

Cho một danh sách liên kết, hoán đổi mỗi cặp nút liên tiếp nhau và trả về đầu của danh sách liên kết đó. Bạn phải giải quyết bài toán mà không thay đổi các giá trị trong các nút của danh sách (nghĩa là chỉ có thể thay đổi các nút chính nó).

Ví dụ 1:

Swap Nodes in Pairs
Swap Nodes in Pairs
Input: head = [1,2,3,4]
Output: [2,1,4,3]

Ví dụ 2:

Input: head = []
Output: []

Ví dụ 3:

Input: head = [1]
Output: [1]

Ràng buộc:

  • Số lượng nút trong danh sách nằm trong khoảng [0, 100].
  • 0 <= giá trị của nút <= 100.

Giải thích thuật toán bằng C++

class Solution {
 public:
  ListNode* swapPairs(ListNode* head) {
    const int length = getLength(head);
    ListNode dummy(0, head);
    ListNode* prev = &dummy;
    ListNode* curr = head;

    for (int i = 0; i < length / 2; ++i) {
      ListNode* next = curr->next;
      curr->next = next->next;
      next->next = prev->next;
      prev->next = next;
      prev = curr;
      curr = curr->next;
    }

    return dummy.next;
  }

 private:
  int getLength(ListNode* head) {
    int length = 0;
    for (ListNode* curr = head; curr; curr = curr->next)
      ++length;
    return length;
  }
};

Đây là một phương thức trong lớp `Solution`. Phương thức này được sử dụng để hoán đổi các cặp nút liên tiếp trong danh sách liên kết và trả về đầu của danh sách liên kết đã được hoán đổi.

Dưới đây là cách thuật toán hoạt động:

1. Phương thức `swapPairs` nhận đầu vào là một con trỏ `head` đến đầu của danh sách liên kết.

2. Sử dụng phương thức `getLength` để tính độ dài của danh sách liên kết.

3. Khởi tạo một nút giả `dummy` với giá trị 0 và con trỏ `next` trỏ tới `head`.

4. Khởi tạo hai con trỏ `prev` và `curr` trỏ tới `dummy` và `head` tương ứng.

5. Với mỗi vòng lặp từ 0 đến `length / 2`, thực hiện các bước sau:

a. Lấy con trỏ `next` trỏ tới nút kế tiếp của `curr`.

b. Gán con trỏ `next` vào nút tiếp theo của `curr`.

c. Gán con trỏ `prev` vào nút tiếp theo của `next`.

d. Gán con trỏ `next` vào nút tiếp theo của `prev`.

e. Di chuyển con trỏ `prev` và `curr` tới nút tiếp theo trong danh sách liên kết.

6. Trả về con trỏ đến nút đầu tiên của danh sách liên kết sau khi hoán đổi.

Thuật toán này sử dụng một phương pháp lặp để hoán đổi các cặp nút liên tiếp trong danh sách liên kết. Bắt đầu bằng việc khởi tạo một nút giả và hai con trỏ `prev` và `curr` trỏ tới nút đầu tiên của danh sách. Trong mỗi bước, ta lấy con trỏ `next` trỏ tới nút kế tiếp của `curr`, sau đó hoán đổi các liên kết giữa các nút để hoán đổi cặp nút hiện tại. Sau đó, di chuyển con trỏ `prev` và `curr` tới cặp nút tiếp theo và tiếp tục quá trình hoán đổi cho đến khi không còn cặp nút để hoán đổi. Cuối cùng, trả về đầu của danh sách liên kết đã được hoán đổi.

Giải thích thuật toán bằng Java

class Solution {
  public ListNode swapPairs(ListNode head) {
    final int length = getLength(head);
    ListNode dummy = new ListNode(0, head);
    ListNode prev = dummy;
    ListNode curr = head;

    for (int i = 0; i < length / 2; ++i) {
      ListNode next = curr.next;
      curr.next = next.next;
      next.next = curr;
      prev.next = next;
      prev = curr;
      curr = curr.next;
    }

    return dummy.next;
  }

  private int getLength(ListNode head) {
    int length = 0;
    for (ListNode curr = head; curr != null; curr = curr.next)
      ++length;
    return length;
  }
}

Giải thích thuật toán bằng Python

class Solution:
  def swapPairs(self, head: ListNode) -> ListNode:
    def getLength(head: ListNode) -> int:
      length = 0
      while head:
        length += 1
        head = head.next
      return length

    length = getLength(head)
    dummy = ListNode(0, head)
    prev = dummy
    curr = head

    for _ in range(length // 2):
      next = curr.next
      curr.next = next.next
      next.next = prev.next
      prev.next = next
      prev = curr
      curr = curr.next

    return dummy.next

 

The post Bài 24 Leetcode: Swap Nodes in Pairs first appeared on Techacademy.



Nhận xét

Bài đăng phổ biến từ blog này

Đề Thi HSG Tin Học Lớp 12 Tỉnh Lào Cai Năm 2025

Rate this post Dưới đây là Đề Thi HSG Tin Học Lớp 12 Tỉnh Lào Cai Năm 2025 Bạn đọc có thể share lời giải bên dưới comment bài viết. Tham khảo: TỔNG HỢP ĐỀ THI CHUYÊN TIN TẤT CẢ CÁC TRƯỜNG TRÊN TOÀN QUỐC TỔNG HỢP ĐỀ THI HỌC SINH GIỎI TIN HỌC LỚP 9 TOÀN QUỐC TỔNG HỢP ĐỀ THI HỌC SINH GIỎI TIN HỌC LỚP 12 TOÀN QUỐC KHÓA HỌC LẬP TRÌNH C++ KHÓA HỌC LẬP TRÌNH PYTHON  The post Đề Thi HSG Tin Học Lớp 12 Tỉnh Lào Cai Năm 2025 first appeared on Techacademy .

Vẽ Tam Giác Trong C++

Vẽ tam giác trong C++ là một trong những bài tập lập trình về C++ sử dụng vòng lặp khá hay giúp các bạn luyện tư duy code cũng như cách sử dụng vòng lặp. Dưới đây là một số lời giải các bài tập vẽ tam giác trong C++ I. Vẽ Tam Giác Cân Trong C++ Viết chương trình C++ sử dụng ký tự * để vẽ tam giác vuông cân trong C++.Chúng ta sử dụng hai vòng lặp lồng nhau để giải bài toán này. Lời Giải: #include <stdio.h> #include <stdlib.h> int main() { int n; int q = 0; printf("Chuong trinh nay se in ra tam giac can\n"); printf("Nhap chieu cao tam giac cua ban: \n"); scanf("%d",&n); while (n > 0) { for (int i = 1; i<n; i++) printf("%c", ' '); for (int k = 0; k <= q; k ++) printf("%c", '*'); n -- ; q += 2 ; printf("\n"); } return 0; } II. Vẽ Hình Tam Giác Trong C++ Viết một chương trình in ra hình ...

Cách Vẽ Hình Trong Scratch

Hãy cùng Techacademy tìm hiểu cách vẽ hình trong lập trình Scratch nhé! Tại đây bạn sẽ biết thêm nhiều điều thú vị và hấp dẫn về cách vẽ các loại hình trong Scratch. I. Cách Vẽ Hình Vuông Trong Scratch Trong bài viết này mình sẽ hướng dẫn các bạn cách vẽ hình vuông trong Scratch đồng thời sử dụng kĩ thuật quay hợp lý để nhân bản tạo thành những hình vẽ đẹp đã ra trong các kì thi tin học trẻ phần vẽ hình bằng Scratch. Hãy tham khảo với onthihsg ngay nhé. + Thủ tục con vẽ hình vuông trong Scratch Trước hết ta cùng xây dựng một mảnh ghép để vẽ hình vuông với tham số là cạnh của hình vuông như sau: Cách Vẽ Hình Vuông Trong Scratch Chỉ cần một vòng lặp lại 4 lần việc vẽ một cạnh và xoay 90 độ là xong, quá đơn giản phải không nào + Vẽ các hình phức tạp hơn từ hình vuông Bây giờ ta hãy phát triển để vẽ hai hình trong đề thi tin học trẻ Đông Triều năm 2019 nào Cách Vẽ Hình Vuông Trong Scratch Nhìn hình ta thấy hình tạo thành từ 5 hình vuông vì vậy ta sẽ gọi 5 lần thủ tục vẽ h...