对经典Java面试问题1
发布人:shili8
发布时间:2024-11-20 02:04
阅读次数:0
**经典Java面试题:单链表反转**
###问题描述反转一个单链表的元素顺序。例如,原链表为 `1 ->2 ->3 ->4`, 反转后变为 `4 ->3 ->2 ->1`。
### 解决方案#### 方法一:递归法
java// Node类定义class Node {
int data;
Node next;
public Node(int data) {
this.data = data;
this.next = null;
}
}
public class LinkedListReverse {
// 递归反转链表 public static Node reverse(Node head) {
if (head == null || head.next == null) {
return head; // 链表长度为1或0,直接返回 }
Node newHead = reverse(head.next); // 递归反转后半段 head.next.next = head; // 反转指针 head.next = null; // 断开原链 return newHead;
}
public static void main(String[] args) {
Node head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
System.out.println("Original List:");
printList(head); // 打印原链表 head = reverse(head); // 反转链表 System.out.println("
Reversed List:");
printList(head); // 打印反转后的链表 }
// 打印链表元素 public static void printList(Node head) {
while (head != null) {
System.out.print(head.data + " ");
head = head.next;
}
System.out.println();
}
}
#### 方法二:迭代法
java// Node类定义class Node {
int data;
Node next;
public Node(int data) {
this.data = data;
this.next = null;
}
}
public class LinkedListReverseIterative {
// 迭代反转链表 public static Node reverse(Node head) {
if (head == null || head.next == null) {
return head; // 链表长度为1或0,直接返回 }
Node prev = null;
Node curr = head;
while (curr != null) {
Node nextTemp = curr.next; // 缓存下一个节点 curr.next = prev; // 反转指针 prev = curr; // 移动prev指针 curr = nextTemp; // 移动curr指针 }
return prev;
}
public static void main(String[] args) {
Node head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
System.out.println("Original List:");
printList(head); // 打印原链表 head = reverse(head); // 反转链表 System.out.println("
Reversed List:");
printList(head); // 打印反转后的链表 }
// 打印链表元素 public static void printList(Node head) {
while (head != null) {
System.out.print(head.data + " ");
head = head.next;
}
System.out.println();
}
}
### 总结本文介绍了两种反转单链表的方法:递归法和迭代法。递归法通过递归反转后半段,然后合并前后半段来实现,而迭代法则是通过一个额外的指针来反转链表。两种方法都可以有效地反转单链表,选择哪种方法取决于具体需求和个人偏好。
### 附注* 本文中的代码示例使用Java语言编写,并且遵循标准的Java编程风格。
*为了方便理解,代码中添加了注释来解释每个部分的功能。
* 本文不包含任何复杂的数学推导或理论背景,只是简单地介绍了两种反转单链表的方法。

