题目链接
https://leetcode.cn/problems/reverse-linked-list-ii/
题目解析
方法1:递归算法
思想:将需要旋转的部分取出,利用递归方法(参考:https://editor.csdn.net/md/?articleId=124715935)进行链表反转,然后再与原链表其余部分进行链接。
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
if(left==right)
{
return head;
}
ListNode dummyNode=new ListNode(-1);
dummyNode.next=head;
ListNode pre=dummyNode;
for(int i=0;i<left-1;i++)
{
pre=pre.next;
}
ListNode leftNode=pre.next;
ListNode rightNode=pre;
for(int i=0;i<right-left+1;i++)
{
rightNode=rightNode.next;
}
ListNode cur=rightNode.next;
pre.next=null;
rightNode.next=null;
reverseList(leftNode);
pre.next=rightNode;
leftNode.next=cur;
return dummyNode.next;
}
public ListNode reverseList(ListNode leftNode)
{
ListNode head=leftNode;
if(head==null || head.next==null)
{
return head;
}
ListNode curr=reverseList(head.next);
head.next.next=head;
head.next=null;
return curr;
}
}
方法2:遍历
思想:从left遍历到right,在遍历的过程中反转链表
第一步:
第二步: 第三步: 注:上述图片为视频中的截图,具体演示过程可参考https://leetcode.cn/problems/reverse-linked-list-ii/solution/92-fan-zhuan-lian-biao-ii-by-chen-wei-f-sjcn/
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
if(left==right)
{
return head;
}
ListNode dummyNode=new ListNode(-1);
dummyNode.next=head;
ListNode pre=dummyNode;
for(int i=0;i<left-1;i++)
{
pre=pre.next;
}
ListNode middleNode=pre.next;
ListNode temp;
for(int i=0;i<right-left;i++)
{
temp=middleNode.next;
middleNode.next=temp.next;
temp.next=pre.next;
pre.next=temp;
}
return dummyNode.next;
}
}
|