当前位置:实例文章 » 其他实例» [文章]对经典Java面试问题1

对经典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编程风格。
*为了方便理解,代码中添加了注释来解释每个部分的功能。
* 本文不包含任何复杂的数学推导或理论背景,只是简单地介绍了两种反转单链表的方法。

相关标签:java
其他信息

其他资源

Top