题目考察的知识点:
- 单链表的基本操作,包括遍历、节点插入和节点删除。
- 链表反转的方法。
题目解答方法的文字分析:这道题目要求我们反转从位置 left 到位置 right 的链表节点。我们可以使用迭代的方法来解决这个问题。
首先,我们需要创建一个虚拟节点 dummy,并将其 next 指针指向链表的头节点 head,这样可以避免处理头节点时的边界情况。然后,我们定义两个指针 pre 和 cur,分别指向要反转部分的前一个节点和当前节点。
我们先将 pre 移动到反转部分的起始位置的前一个节点,也就是移动 left - 1 次。然后,将 cur 指向 pre 的下一个节点,将 next 指向 cur 的下一个节点,这样我们就可以通过改变节点之间的指针关系来完成链表节点的反转。我们将 cur 的 next 指针指向 next 的 next 节点,将 next 的 next 指针指向 pre 的 next 节点,然后将 pre 的 next 指针指向 next,完成一次节点反转。重复这个过程 right - left 次,即可完成从位置 left 到位置 right 的链表节点反转。
最后,返回虚拟节点 dummy 的 next 指针,即为反转后的链表头节点。
本题解析所用的编程语言:Java
完整且正确的编程代码如下:
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param left int整型 * @param right int整型 * @return ListNode类 */ public ListNode reverseBetween (ListNode head, int left, int right) { ListNode dummy = new ListNode(-1); dummy.next = head; ListNode pre = dummy; for (int i = 0; i < left - 1; i++) { pre = pre.next; } ListNode cur = pre.next; ListNode next = cur.next; for (int i = 0; i < right - left; i++) { cur.next = next.next; next.next = pre.next; pre.next = next; next = cur.next; } return dummy.next; } }