码迷,mamicode.com
首页 > 其他好文 > 详细

【Leetcode】92. Reverse Linked List II && 206. Reverse Linked List

时间:2016-06-28 18:40:09      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

  The task is reversing a list in range m to n(92) or a whole list(206).

  All in one : U need three pointers to achieve this goal. 

   1) Pointer to last value

   2) Pointer to cur p value

   3) Pointer to next value

  Here, showing my code wishes can help u.

  

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

typedef struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
}ListNode, *PNode;

void create_List(PNode head)
{
    PNode  p = head;
    int n;
    cin>>n;
    for(int i = 0; i < n ;i ++){
        int t;
        cin>>t;
        if(i == 0){
            head -> val = t;
            head -> next = NULL;
            cout<<"head is "<<head->val<<endl;
            p = head;
        }else{
            PNode newNode = (PNode) malloc(sizeof(PNode));
            newNode -> val = t;
            newNode -> next = NULL;
            p -> next = newNode;
            p = newNode;
            cout<<"p is "<<p -> val<<endl;
        }
    }
}

void display(PNode  head)
{
    PNode p = head;
    while(p){
        cout<<p->val<<" -> ";
        p = p -> next;
    }cout<<endl;
}

class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        if(m == n || head == NULL) return head;
        ListNode *pLast = head, *p = head -> next, *pNext = NULL;
        ListNode *newN = NULL, *newM = NULL, *beforeM = head, *afterN = NULL;
        int pos = 1;
        while(p){
            if(pos == m - 1){
                beforeM = pLast;
                pLast = p;
                p = p -> next;
            }
            else if(pos >= m && pos < n){
                pNext = p -> next;
                p -> next = pLast;
                if(pos == m){
                    pLast -> next = NULL;
                    newM = pLast;
                }
                pLast = p;
                if(pos == n - 1){
                    newN = p;
                    afterN = pNext;
                }
                p = pNext;
            }else{
                pLast = p;
                p = p -> next;
            }
            pos ++;
        }
        if( m==1 && afterN == NULL){
            head = newN;
        }else if(m == 1){
            head = newN;
            newM -> next = afterN;
        }else{
            beforeM -> next = newN;
            newM -> next = afterN;
        }
        return head;
    }

    ListNode* reverseList(ListNode* head) {
        if(head == NULL) return head;
        ListNode *pLast = head, *p = head -> next, *pNext = NULL;
        while(p){
            pNext = p -> next;
            p -> next = pLast;
            if(pLast == head){
                pLast -> next = NULL;
            }
            pLast = p;
            p = pNext;
        }
        head = pLast;
        return head;
    }
};
int main()
{
    PNode head = (PNode) malloc(sizeof(PNode));;
    create_List(head);
    cout<<"after creating , head is "<<head->val<<endl;
    display(head);
    Solution tmp = Solution();
    //tmp.reverseBetween(head, 2, 3);
    tmp.reverseList(head);
    system("pause");
    return 0;
}

 

【Leetcode】92. Reverse Linked List II && 206. Reverse Linked List

标签:

原文地址:http://www.cnblogs.com/luntai/p/5624169.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!