剑指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】判断二叉树平衡

题目:输入一个二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 剑指offer上给的第二种思路,用后序遍历真的是将递归发...
  • mmc_maodun
  • mmc_maodun
  • 2014年05月28日 08:22
  • 3062

剑指offer-链表专题

6 从尾到头打印链表http://blog.csdn.net/yc1203968305/article/details/7928212218 删除链表的结点http://blog.csdn.net/y...
  • yc1203968305
  • yc1203968305
  • 2018年02月07日 17:12
  • 4

剑指offer-合并排序链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 java:(考虑周全就行)           /* public...
  • SoundSlow
  • SoundSlow
  • 2016年01月07日 23:03
  • 482

剑指offer-从头到尾打印链表

class Solution: def printListFromTailToHead(self, listNode): # write code here l...
  • a787264137
  • a787264137
  • 2017年11月21日 12:21
  • 33

剑指offer-归并排序

package Sai.XiaoMI; /** * 2) 归并排序 * * @author WangSai * */ public class Solution { /** * ...
  • VIP_WangSai
  • VIP_WangSai
  • 2017年06月01日 01:55
  • 144

剑指Offer-字符串

替换空格题目描述请实现一个函数,将一个字符串中的空格替换成 “%20”。例如,当字符串为 We Are Happy. 则经过替换之后的字符串为 We%20Are%20Happy。 时间限制:1 秒 空...
  • surp2011
  • surp2011
  • 2016年12月27日 15:11
  • 234

剑指offer-快速排序

快速排序 package case99_QuickSort; public class QuickSort { // 快速排序 public static void main(String[]...
  • VIP_WangSai
  • VIP_WangSai
  • 2017年04月17日 17:41
  • 193

剑指offer-数组查找

题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 输入描述: arr...
  • sinat_27612639
  • sinat_27612639
  • 2016年06月30日 10:08
  • 103

剑指Offer-变态跳台阶

变态跳台阶题目描述:   一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 解题思路:   仔细分析一下可以发现问题数组的第n个的结...
  • yannanying
  • yannanying
  • 2015年08月27日 21:31
  • 341

剑指Offer-栈

剑指Offer-栈此处两道题为《剑指Offer》中举例让抽象问题具体化的21和22题,记录一下实现思路。题1,包含min函数的栈:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数思...
  • u011197534
  • u011197534
  • 2017年10月26日 15:43
  • 37
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指offer-链表
举报原因:
原因补充:

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