【leetcode】92.(Medium)Reverse Linked List II
阿新 • • 發佈:2018-12-02
解題思路:
這道題的意思是,有一串連結串列,將第m位到第n位翻轉過來,比如對於連結串列1-2-3-4-5,翻轉第2到第4位後就是1-4-3-2-5
題目要求只遍歷一遍連結串列
我的想法是將翻轉的部分用棧存起來,然後重新新建結點
general的做法是直接修改原連結串列的結點指向關係,比如對於上面的題有:
1-2-3-4-5
1-3-2-4-5
1-4-3-2-5
對於1-2-3-4-5-6-7,如果要翻轉3到6位的話就是:
1-2-3-4-5-6-7
1-3-2-4-5-6-7
1-4-3-2-5-6-7
1-5-4-3-2-6-7
1-6-5-4-3-2-7
這樣的步驟
這兩種做法從提交來看是耗時是差不多的,但是用棧的話需要額外的記憶體空間
提交程式碼:棧
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
int pStack=0;
int[] stack=new int[n-m+1];
ListNode fakeHead=new ListNode(-1);
fakeHead.next=head;
ListNode p1=fakeHead,p2;
for(int i=0;i<m-1;i++) p1= p1.next;
p2=p1;p1=p1.next;
for(int i=m;i<=n;i++) {
stack[pStack++]=p1.val;
p1=p1.next;
}
for(pStack=n-m;pStack>=0;pStack--) {
ListNode newNode=new ListNode(stack[pStack]);
p2.next=newNode;p2=p2.next;
}p2.next= p1;
return fakeHead.next;
}
}
執行結果:
提交程式碼:直接修改結點指向
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode dummy=new ListNode(-1);
dummy.next=head;
ListNode pre=dummy,start,then;
for(int i=0;i<m-1;i++) pre=pre.next;
start=pre.next;
then=start.next;
for(int i=0;i<n-m;i++) {
start.next=then.next;
then.next=pre.next;
pre.next=then;
then=start.next;
}
return dummy.next;
}
}
執行結果: