Tôi đồng ý với @Khi không đưa ra câu trả lời (hoàn toàn), nhưng tôi nghĩ tôi nên cung cấp cho bạn gợi ý.
Một điều quan trọng cần hiểu là Java không xác định rõ ràng con trỏ - đúng hơn, bất cứ khi nào một tổ chức phi nguyên thủy (ví dụ như không char
, byte
, int
, double
, float
, long
, boolean
, short
) được chuyển đến một chức năng, nó được chuyển như một tham chiếu. Vì vậy, bạn có thể sử dụng các biến tạm thời để hoán đổi các giá trị. Hãy thử tự viết mã cho chính bạn hoặc xem bên dưới:
public static void swapNodeNexts(final Node n1, final Node n2) {
final Node n1Next = n1.next;
final Node n2Next = n2.next;
n2.next = n1Next;
n1.next = n2Next;
}
Sau đó, bạn sẽ cần cấu trúc dữ liệu để giữ Node
s. Điều quan trọng là chỉ có một số chẵn Node
s (số lẻ không cần thiết phức tạp). Nó cũng cần thiết để khởi tạo các nút. Bạn nên đặt điều này trong phương pháp chính của bạn.
public static final int NUMPAIRS = 3;
public static void main(final String[] args) {
final Node[] nodeList = new Node[NUMPAIRS * 2];
for (int i = 0; i < nodeList.length; i++) {
nodeList[i] = new Node();
nodeList[i].n = (i + 1) * 10;
// 10 20 30 40
}
// ...
}
Phần quan trọng là đặt giá trị tiếp theo cho nút. Bạn không thể lặp qua vòng lặp for
cho tất cả chúng, bởi vì sau đó vòng cuối cùng của next
sẽ ném một số IndexOutOfBoundsException
. Cố gắng tự mình làm một, hoặc nhìn trộm tôi.
for (int i = 0; i < nodeList.length - 1; i++) {
nodeList[i].next = nodeList[i + 1];
}
nodeList[nodeList.length - 1].next = nodeList[0];
Sau đó chạy chức năng hoán đổi trên chúng với vòng lặp for
. Nhưng hãy nhớ, bạn không muốn chạy nó trên mỗi nút… suy nghĩ về nó một chút.
Nếu bạn không thể tìm ra nó, đây là mã cuối cùng của tôi:
// Node
class Node {
public int n; // value
public Node next; // pointer to next node
@Override
public String toString() {
return "Node [n=" + n + ", nextValue=" + next.n + "]";
}
}
// NodeMain
public class NodeMain {
public static final int NUMPAIRS = 3;
public static void main(final String[] args) {
final Node[] nodeList = new Node[NUMPAIRS * 2];
for (int i = 0; i < nodeList.length; i++) {
nodeList[i] = new Node();
nodeList[i].n = (i + 1) * 10;
// 10 20 30 40
}
for (int i = 0; i < nodeList.length - 1; i++) {
nodeList[i].next = nodeList[i + 1];
}
nodeList[nodeList.length - 1].next = nodeList[0];
// This makes 1 -> 2 -> 3 -> 4 -> 1 etc.
printNodes(nodeList);
for (int i = 0; i < nodeList.length; i += 2) {
swapNodeNexts(nodeList[i], nodeList[i + 1]);
}
// Now: 2 -> 1 -> 4 -> 3 -> 1 etc.
printNodes(nodeList);
}
private static void printNodes(final Node[] nodeList) {
for (int i = 0; i < nodeList.length; i++) {
System.out.println("Node " + (i + 1) + ": " + nodeList[i].n
+ "; next: " + nodeList[i].next.n);
}
System.out.println();
}
private static void swapNodeNexts(final Node n1, final Node n2) {
final Node n1Next = n1.next;
final Node n2Next = n2.next;
n2.next = n1Next;
n1.next = n2Next;
}
}
Tôi hy vọng bạn đã có thể tìm ra ít nhất một số này theo hướng dẫn. Quan trọng hơn, tuy nhiên, điều quan trọng là bạn hiểu các khái niệm ở đây. Nếu bạn có bất kỳ câu hỏi nào, chỉ cần để lại nhận xét.
Bạn có gì cho đến nay? : D –
Đây là câu hỏi phỏng vấn, không phải bài tập về nhà? Hấp dẫn. – corsiKa
Downvote là gì? Đây là một câu hỏi hợp lệ, và nó cũng thú vị ... upvoting. – wchargin