1. 程式人生 > >【leetcode】92.(Medium)Reverse Linked List II

【leetcode】92.(Medium)Reverse Linked List II

解題思路:
這道題的意思是,有一串連結串列,將第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;
    }
}

執行結果:

在這裡插入圖片描述