关闭

剑指offer-链表

102人阅读 评论(0) 收藏 举报
分类:

单向链表的结构定义

typedef int DataType; 
struct ListNode
{
    DataType value;
    ListNode *next;
}

问题1、往链表的末尾添加一个结点

//给定头结点,往末尾插入一个结点
void InsertNode(ListNode **head,DataType key){
    ListNode *q=new ListNode;
    q->next=NULL;
    q->value=key;
    if(*head==NULL){
        *head=q;
        return ;
    }   
    ListNode *p=*head;
    while(p->next!=NULL){
        p=p->next;
    }
    p->next=q;
}

问题2、找到第一个含有某值的结点并删除该结点

void DeletNode(ListNode **head, DataType key){
    ListNode *p = *head;
    ListNode *q = NULL;
    ListNode *pre = NULL;
    if ((*head)->value == key){
        *head = (*head)->next;
        delete p;
        return ;
    }
    while (p->next){
        pre = p;
        if (p->next->value == key)
        {
            q = p->next;
            break;
        }
        p=p->next;
    }
    cout<<q->value<<endl;
    pre->next = q->next;
    delete q;
}

问题3、从尾到头打印链表

void  ReversePrint(ListNode *head){
    if (head->next !=NULL){
        ReversePrint(head->next);
    }
    cout<<"<-"<<head->value;
}

问题4、找到链表中的倒数第k个结点

//找到倒数第k个结点
ListNode* FindLastKNode(ListNode *head, int k){
    if (head==NULL||k==0)   return NULL;   
    ListNode *p1=head;
    int i=0;
    while (i<k-1&&p1!=NULL)
    {
        p1=p1->next;
        i++;
    }
    if (i!=k-1)
            return NULL;
    ListNode *p2=head;
    while (p1->next)
    {
        p1=p1->next;
        p2=p2->next;
    }
    return p2;
}

问题5、反转链表

//非递归实现
ListNode  *ReveseNode(ListNode *head){
    ListNode *p=head;
    ListNode *pre=NULL;
    while(p){
        ListNode  *q=p->next;
        p->next=pre;
        pre=p;
        p=q;
    }
    return pre;
}

//递归实现
ListNode *ReverseNode (ListNode *oldHead,ListNode *newHead){
    ListNode *next=oldHead->next;
    oldHead->next= newHead;
    newHead=oldHead;
    if(next==NULL)     return newHead;
    else
        return Reverse(next,newHead);
}

问题6、复杂链表的深度复制
这里写图片描述

//1.先复制一个指针next并将对应的结点保存在map中,之后遍历mp指针连接对应的mp
//map保存A-A',B-B'.......
map<ListNode*,ListNode*>     NodeMap;
ListNode * CopyList(ListNode *head)
{
    if(head==NULL)    return NULL;
    ListNode *newHeat=new ListNode;
    root->next=NULL;
    root->mp=NULL;
    root->data=head->data;
    NodeMap.insert(pair<ListNode*,ListNode*>(head,newHead));
    ListNode *p1=head->next;
    ListNode *p2=newHead;
    while(p1){
        ListNode *q=new ListNode;
        q->next=NULL;
        q->mp=NULL;
        q->data=p->data;
        p2->next=q;
        p2=p2->next;
        NodeMap.insert(pair<ListNode*,ListNode*>(p1,p2));
        p1=p1->next;
    }
    return root;
}
void CompleteList(ListNode *root,ListNode *head){
    ListNode *p1=head;
    while(p1){
        if(p1->mp){
            NodeMap[p1]->mp=NodeMap[p1->mp];
        }
        p1=p1->next;
    }
}


//2.剑指offer给出的方案:将原来链表扩大一倍,A->A’->B->B'->C->C'->D->D'->E->E',然后进行操作。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12838次
    • 积分:589
    • 等级:
    • 排名:千里之外
    • 原创:47篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条