作者:~小明学编程
文章专栏:每日一练——Java
格言:目之所及皆为回忆,心之所想皆为过往
目录
反转链表2
链接
题目描述:
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
//若左右相等则不用反转直接返回首节点
if(left==right) {
return head;
}
//哑巴节点用于串接新链表
ListNode newList = new ListNode(-1);
//copy一个哑巴节点
ListNode curNewList = newList;
//copy一个首节点用于遍历链表
ListNode cur = head;
//定义一个步长即为所需反转的长度
int step = right-left+1;
//将新链表分成左中右三个部分
//串联左边的部分
while(left--!=1) {
curNewList.next = cur;
cur = cur.next;
curNewList = curNewList.next;
}
//标记一个右节点,用于最后的连接
//开始对中间部分进行反转
ListNode midRight = cur;
//设置一个前节点
//prev将成为最后的midLeft
ListNode prev=null;
while(step--!=0) {
ListNode curNext = cur.next;
cur.next = prev;
prev = cur;
cur = curNext;
}
//如果right不是最后一个节点的话将三个部分进行连接
if(cur!=null) {
curNewList.next = prev;
midRight.next = cur;
} else {
curNewList.next = prev;
}
return newList.next;
}
}