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

Hướng Dẫn Cài Đặt Python Trên Máy Tính?

Python là một ngôn ngữ lập trình phổ biến và được sử dụng rộng rãi trong lĩnh vực phát triển phần mềm và khoa học dữ liệu. Để bắt đầu sử dụng Python trên máy tính của bạn, bạn cần cài đặt nó. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách cài đặt Python trên máy tính một cách dễ dàng. I. Cài Đặt Python Trên Vscode Python là một ngôn ngữ lập trình phổ biến và VS Code là một trình soạn thảo mã nguồn được ưa chuộng. Kết hợp cả hai, bạn có thể tận dụng lợi ích của cả hai công cụ để phát triển ứng dụng Python một cách hiệu quả. Trong bài viết này, chúng tôi sẽ hướng dẫn cách cài đặt Python trên VS Code. Bước 1: Cài đặt VS Code Trước khi bắt đầu, bạn cần cài đặt VS Code trên máy tính của mình. Truy cập trang web vscode.com, tải xuống phiên bản phù hợp với hệ điều hành của bạn và làm theo hướng dẫn trên màn hình để hoàn tất quá trình cài đặt. Bước 2: Cài đặt Extension Python cho VS Code Sau khi cài đặt VS Code, bạn cần cài đặt extension Python để hỗ trợ phát triển ứng dụng Python t...

Phím Tắt Eclipse Thông Dụng Và Tiện Lợi Nhất ! Đọc Ngay Nếu Bạn Vẫn Đang Dùng Chuột

Việc sử dụng các thao tác click chuột nhiều lần trong Eclipse khiến các coder nhàm chán và tốn thời gian, hãy cải tạo nó bằng các phím tắt trong Eclipse. Dưới đây là danh sách một số những phím tắt thông dụng bạn nên biết. phím tắt eclipse (1) Đầu tiên hãy sử dụng phím tắt Ctrl + Shift + L để hiển thị danh sách các phím tắt trong Eclipse. phím tắt eclipse (2) Danh sách tất cả những phím tắt trong Eclipse bạn có thể áp dụng, được chia thành 12 mục khác nhau tùy thuộc vào tác dụng của phím tắt: 1. Quản lý tập tin và dự án Ctrl + N Tạo dự án mới bằng Wizard Ctrl + Alt + N Tạo dự án , tập tin, lớp, vv Alt + F Mở dự án, tệp, v.v. Ctrl + Shift + R Mở Resource (tệp, thư mục hoặc dự án) Alt + Enter Hiển thị và truy cập các thuộc tính tệp Ctrl + S Save tập tin hiện tại Ctrl + Shift + S Save tất cả các tập tin Ctrl + W Đóng tệp hiện tại Ctrl + Shift + W Đóng tất cả các tệp F5 Làm mới nội dung của phần tử đã chọn bằng hệ thống tệp cục bộ 2. Cửa sổ trình chỉnh sửa F1...

Kiểu Date Trong Java

Date trong Java là 1 trong các class mô tả ngày tháng đầu tiên trong Java. Thật đáng tiếc là hầu hết các cách thức của nó đã lỗi thời, và thay vào đó là dùng các cách thức của java.util.Calendar. Nhưng bạn vẫn có thể dùng java.util.Date để mô tả ngày tháng. 1. Các Lớp Date, Time, Calendar Trong Java Java cung cấp 1 số class liên quan tới thời gian và lịch (Calendar), sau đây là danh sách các class này: Class Mô tả java.util.Date 1 lớp đại diện cho ngày tháng năm và thời gian. Tiếc là hầu hết các cách thức của nó đã bị lỗi thời, khuyến cáo là không nên dùng các cách thức đó, tuy nhiên lớp Date vẫn được dùng rỗng rãi. java.util.concurrent.TimeUnit TimeUnit là 1 Enum mô tả các đơn vị ngày tháng năm và thời gian. java.sql.Date 1 lớp mô tả ngày tháng năm. Thông tin về thời gian bị cắt bỏ. Lớp này thường dùng trong JDBC. java.sql.Time 1 lớp mô tả thời gian (Giờ phút giây, milli giây), và không chứa thông tin ngày tháng năm. Lớp này thường dùng trong...