标题:使用Java实现反转链表 II
在本文中,我们将解决LeetCode上的第六十题,即反转链表 II。题目要求给定一个单链表的头指针head和两个整数left和right,其中left <= right。我们需要反转从位置left到位置right的链表节点,并返回反转后的链表。
题目要求反转链表的一部分,这需要我们找到反转的起始位置和结束位置,然后对这一部分进行反转。同时,我们需要考虑边界情况,如链表为空、left等于right等情况。
我们可以使用三个指针来处理这个问题:pre、cur、next。具体步骤如下:
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public class ReverseBetween {
public ListNode reverseBetween(ListNode head, int left, int right) {
if (head == null) return null;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode pre = dummy;
// 找到left位置的前一个节点pre
for (int i = 0; i < left - 1; i++) {
pre = pre.next;
}
ListNode cur = pre.next;
ListNode next;
// 反转left到right位置的节点
for (int i = 0; i < right - left; i++) {
next = cur.next;
cur.next = next.next;
next.next = pre.next;
pre.next = next;
}
return dummy.next;
}
}我们使用几个示例来测试我们的代码:
public class Main {
public static void main(String[] args) {
// 示例1
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(5);
node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5;
ReverseBetween solution = new ReverseBetween();
ListNode reversedList1 = solution.reverseBetween(node1, 2, 4);
printList(reversedList1);
// 示例2
ListNode node6 = new ListNode(5);
ListNode reversedList2 = solution.reverseBetween(node6, 1, 1);
printList(reversedList2);
}
public static void printList(ListNode head) {
ListNode cur = head;
while (cur != null) {
System.out.print(cur.val + " ");
cur = cur.next;
}
System.out.println();
}
}本文介绍了如何使用Java实现反转链表 II。通过使用三个指针,我们可以有效地反转链表的一部分,满足题目的要求。这是一道常见的链表问题,在面试中也经常会被考察到。