一.方法一:头插法
思路:首先找到需要反转区间的第一个节点及其前驱节点,接着将反转区间里的每一个元素按顺序插入到反转区间的头部
代码:
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
if(head==null||head.next==null){
return head;
}
ListNode cal=new ListNode(-1);
cal.next=head;
ListNode p1=cal;
for(int i=0;i<left-1;i++){
p1=p1.next;
}
ListNode p2=p1.next;
for(int i=0;i<right-left;i++){
ListNode p3=p2.next;
p2.next=p3.next;
p3.next=p1.next;
p1.next=p3;
}
return cal.next;
}
}
二.方法二:使用栈
思路:将反转区间里的节点都入栈,然后挨个出栈
代码:
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
if(head==null||head.next==null){
return head;
}
Stack<ListNode> s=new Stack();
ListNode cal=new ListNode(-1);
cal.next=head;
ListNode p2=cal;
ListNode p3=cal;
for(int i=0;i<left-1;i++){
p2=p2.next;
}
for(int i=0;i<=right;i++){
p3=p3.next;
}
ListNode p1=p2.next;
for(int i=0;i<=right-left&&p1!=null;i++){
s.push(p1);
p1=p1.next;
}
while(!s.empty()){
p2.next=s.pop();
p2=p2.next;
}
p2.next=p3;
return cal.next;
}
}