给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
提示:
链表中节点数目为 n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
今天是也是参考了大佬的解法的一天。
用的是插头法
public static class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
/**
* #92 反转链表 II
* @param head
* @param left
* @param right
* @return
*/
public ListNode reverseBetween(ListNode head, int left, int right) {
int count =1; //用来标记目前遍历开始于结束, count>=left 表示开始 count>right 表示结束
ListNode dummy = new ListNode(0);//定义哑节点 dummy
dummy.next=head;
ListNode pre = dummy;
while (pre.next!=null && count<left){//将pre指向开始节点的前一个节点
pre = pre.next;
count++;
}
ListNode cur = pre.next;//给cur赋初值 cur表示指向当前要翻转的链表结点
ListNode tail = cur;//给tai赋初值 指向已经翻转的链表的结尾,用它来把已翻转的链表和剩余链表进行拼接。
while (cur!=null && count<=right){//遍历开始
ListNode nxt = cur.next; //指向 cur.next ,表示下一个要被翻转的链表结点
//下面三行表示插头法,即cur放在pre的后面
cur.next=pre.next;
pre.next=cur;
tail.next=nxt;
cur=nxt;//为下一次迭代赋值
count++;
}
return dummy.next;
}
此文章创于本人学习时的记录,如有错误或更优解还请指出