剑指offer-链表

原创 2016年08月29日 22:23:34

单向链表的结构定义

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',然后进行操作。

剑指offer面试题15-链表中倒数第k个节点

题目: 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。 例如一个链表有6个节点,从头结点开始他们的值依次是1、2、3、4、5、6,...

【剑指offer】从尾到头打印单链表

题目描述: 输入一个链表,从尾到头打印链表每个节点的值。 输入: 每个输入文件仅包含一组测试样例。 每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类...

剑指Offer:复杂链表的复制

# -*- coding:utf-8 -*- #class RandomListNode: # def __init__(self, x): # self.label = x #...

剑指Offer面试题16(Java版):反转链表

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的。很多的面试官喜欢出链表相关的问题,就是想通过指...

【剑指offer】递归循环两种方式反转链表

本文分别用非递归和递归两种方式实现了链表的反转,在九度OJ上测试了非递归版本,AC。 题目描述: 输入一个链表,反转链表后,输出链表的所有元素。 (hint : 请务必使用链表) 输入: 输入可能包含...

剑指offer解题报告(Java版)——二叉搜索树转换为双向链表 27

原文链接 http://www.cnblogs.com/keedor/p/4467040.html 引言     自己觉得对二叉树了解的不是很多,所以想专门练习...

剑指offer 合并两个排序的链表

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 (hint: 请务必使用链表。)思路:首先新建一个链表,因为连个链表都是有序的,所以只需要...
  • s_h_r
  • s_h_r
  • 2016年03月13日 10:07
  • 190

剑指Offer: 链表中环的入口结点

链表中环的入口结点一个链表中包含环,请找出该链表的环的入口结点。方法一:维护一个哈希表 1、哈希容器set。 2、加入元素,通过返回值判断加入失败则是入口结点。 3、注意非环对空指针的判断。 ...
  • BestZem
  • BestZem
  • 2016年08月09日 16:35
  • 501

剑指offer面试题13-在O(1)时间删除链表的节点

题目: 给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。 要想在O(1)时间搞定,绝对不能用遍历。 这里采用将后面的一个节点复制到当前节点的方法。 不...

【剑指offer】链表倒数第k个节点

在Cracking the Code Interview上做过了一次,这次在九度OJ上测试,AC。 题目描述: 输入一个链表,输出该链表中倒数第k个结点。 (hint: 请务必使用链表。) 输入: 输...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指offer-链表
举报原因:
原因补充:

(最多只允许输入30个字)