2018年7月2日星期一

链表翻转

#include <iostream>
using namespace std;

/*
链表翻转。给出一个链表和一个数k,比如,链表为1→2→3→4→5→6,k=2,则翻转后2→1→6→5→4→3,
若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→6→5,用程序实现。
*/

struct LinkList
{
int data;
LinkList* next;
LinkList(int i=0){data=i; next=NULL;}
};

void print_list(LinkList* head){
LinkList* p = head;
while(p){
cout<<p->data<<' ';
p = p->next;
}
cout<<endl;
}

LinkList* reverse(LinkList* head, int k){
    if(head == NULL)
    {
        return NULL;
    }
    int i = k;
    LinkList* end = head;
    int length = 1;
    while(--i)
    {
        if(end->next==NULL){
            k = length;
            break;
        }
        else{
            end = end->next;
            length += 1;
        }
    }
    i = k;
    LinkList* save = end->next;
    LinkList* p1 = head;
    LinkList* p2 = head->next;
    while(--i)
    {
        LinkList* temp = p2->next;
        p2->next = p1;
        p1 = p2;
        p2 = temp;
    }
    head->next = reverse(save, k);
    return end;
}

int main(){
LinkList* n1 = new LinkList(1);
LinkList* p = n1;
for(int i=2; i<12; i++)
{
LinkList* temp = new LinkList(i);
p->next = temp;
p = p->next;
}
print_list(n1);
    LinkList* a = reverse(n1, 4);
    print_list(a);

}

leetcode 17

17.   Letter Combinations of a Phone Number Medium Given a string containing digits from   2-9   inclusive, return all possible l...