`
kmplayer
  • 浏览: 510221 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

链表面试题目

阅读更多
1,给定一单链表A1->A2->A3->......->AN, 转换为A2->A1->A4->A3->.....->AN(如果N是偶数),转换为 A1->A3->A2->A5->A4->....->AN(如果N是奇数),要求是只能便利一遍链表。
#include <stdio.h>
#include <stdlib.h>
 
typedef struct _Node Node;
 
struct _Node {
    int data;
    Node* next;
};
 
Node* node_new(int data, Node* next) {
    Node* node = (Node*)(malloc(sizeof(Node)));
    node->data=data;
    node->next=next;
    return node;
}
 
void node_free(Node* node) {
    free(node);
}
 
typedef int BOOL;
#define FALSE (0)
#define TRUE (!FALSE)
 
BOOL vswap_inner(Node** pp, Node** dangling) {
    // pp: input as the current head node
    //     output as the even point.
    // dangling: output only
    if(*pp==NULL) {
        return TRUE;
    } else {
        Node* first = *pp;
        Node* rest = first->next;
        Node* ndangling;
        BOOL even = vswap_inner(&rest,&ndangling);
        if(even) {
            *pp=rest;
            *dangling=first;
            return FALSE;
        } else {
            ndangling->next = first;
            first->next = rest;
            *pp=ndangling;
            //*dangling=NULL; // Not useful
            return TRUE;
        }
    }
}
 
void vswap(Node** pp_head) {
    Node *dangling = NULL;
    BOOL even = vswap_inner(pp_head,&dangling);
    if(!even) {
        dangling->next = *pp_head;
        *pp_head=dangling;
    }
}
 
void node_seq_print(Node* node) {
    if(node==NULL) {
        printf("\n");
    } else {
        printf("%d ",node->data);
        node_seq_print(node->next);
    }
}
 
int main() {
    Node *node = node_new(1,  
            node_new(2,  
                node_new(3,  
                    node_new(4,  
                        node_new(5, NULL)
                        ))));
 
    Node *node2 = node_new(1,  
            node_new(2,  
                node_new(3,  
                    node_new(4, NULL)
                        )));
 
    vswap(&node);
    vswap(&node2);
 
    node_seq_print(node);
    node_seq_print(node2);
 
    return 0;
} 

2,逆序一个链表
//定义数据结构
struct Node
{
    Node(int i):data(i),next(0){}
    int data;
    Node* next;
};

Node* reverseList(Node* head)
{
    if(head==NULL||head->next==NULL)
        return head;
    Node* p1=head;
    Node* p2=p1->next;
    Node* p3=p2->next;
    p1->next=NULL;
    while(p3!=NULL)
    {
        p2->next=p1;
        p1=p2;
        p2=p3;
        p3=p3->next;
    }
    p2->next=p1;
    head=p2;
    return head;
}

Node* recursiveReverseList(Node* head) //递归方法逆序
{
    Node *rHead;
    if ((head == NULL) || (head->next == NULL))
    {
        return head;
    }
    else
    {
        rHead = recursiveReverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return rHead;
    }
}

//释放带环的节点
void freeList(Node* head)
{
    Node* p;
    Node* tmp;
    for(p=head;p;p=tmp)
    {
        tmp=p->next;
        delete p;
    }
}

//打印链表中的数据,存在环,必定是死循环
void printList(Node* head)
{
    Node* p;
    for(p=head;p;p=p->next)
        cout<< p->data<<(p->next? " ":"");
    cout<<endl;
    return;
}


int main()
{
    Node *node=new Node(0);
    Node* head=node;
    for(int i=1;i<7;++i)
    {
        node->next=new Node(i);
        node=node->next;
    }
    printList(head);
    head=reverseList(head);
    printList(head);
    head=recursiveReverseList(head);
    printList(head);
    free(head);

    return 0;
}


3,合并两个有序链表
#include <iostream>
using namespace std;

//定义数据结构
struct Node
{
    Node(int i):data(i),next(0){}
    int data;
    Node* next;
};


//释放带环的节点
void freeList(Node* head)
{
    Node* p;
    Node* tmp;
    for(p=head;p;p=tmp)
    {
        tmp=p->next;
        delete p;
    }
}

//打印链表中的数据,存在环,必定是死循环
void printList(Node* head)
{
    Node* p;
    for(p=head;p;p=p->next)
        cout<< p->data<<(p->next? " ":"");
    cout<<endl;
    return;
}

//非递归合并两个有序链表
Node * Merge(Node *head1 , Node *head2)
{
    if ( head1 == NULL)
        return head2 ;
    if ( head2 == NULL)
        return head1 ;
    Node *head = NULL ;
    Node *p1 = NULL;
    Node *p2 = NULL;
    if ( head1->data < head2->data )
    {
        head = head1 ;
        p1 = head1->next;
        p2 = head2 ;
    }
    else
    {
        head = head2 ;
        p2 = head2->next ;
        p1 = head1 ;
    }
    Node *pcurrent = head ;
    while ( p1 != NULL && p2 != NULL)
    {
        if ( p1->data <= p2->data )
        {
            pcurrent->next = p1 ;
            pcurrent = pcurrent->next ;
            p1 = p1->next ;
        }
    else
    {
        pcurrent->next = p2 ;
        pcurrent = pcurrent->next ;
        p2 = p2->next ;
    }
    }
    if ( p1 != NULL )
        pcurrent->next = p1 ;
    if ( p2 != NULL )
        pcurrent->next = p2 ;
    return head ;
}

//递归合并两个有序链表
Node * ReMerge(Node *head1 , Node *head2)
{
    if ( head1 == NULL)
        return head2 ;
    if ( head2 == NULL)
        return head1 ;
    Node *head = NULL ;
    if ( head1->data < head2->data )
    {
        head = head1 ;
        head->next=ReMerge(head1->next,head2);
    }
    else
    {
        head = head2 ;
        head->next=ReMerge(head1,head2->next);
    }
    return head ;
}


int main()
{
    Node *node1=new Node(0);
    Node* head1=node1;
    for(int i=1;i<9;i+=3)
    {
        node1->next=new Node(i);
        node1=node1->next;
    }
    printList(head1);

    Node *node2=new Node(1);
    Node* head2=node2;
    for(int i=3;i<9;i+=2)
    {
        node2->next=new Node(i);
        node2=node2->next;
    }
    printList(head2);

    //Node* head=Merge(head1,head2);
    Node* head=ReMerge(head1,head2);
    printList(head);

    free(head);
    return 0;
}
分享到:
评论

相关推荐

    链表面试题目总结 全

    在计算机科学领域,链表...最后,链表的面试题目往往不只考察编程技能,还包括逻辑思维能力、问题解决能力等。面试者在准备这些题目时,不仅要学会算法的具体实现,还要理解算法背后的原理,这样才能在面试中表现出色。

    链表面试题总结

    根据提供的文件信息,这里将对链表相关的面试题目进行总结,并深入探讨其中涉及的数据结构与算法知识点。 ### 链表基础知识回顾 在讨论具体的面试题之前,我们首先需要了解链表的基本概念及其操作方法。链表是一种...

    链表面试题_链表_面试题_cow3cm_数据结构_

    - 反转链表:常见的面试题目,有多种算法实现,如迭代法、递归法等。 - 合并两个有序链表:将两个有序链表合并成一个新的有序链表。 - 删除中间节点:给定一个指向链表中间节点的指针,如何删除这个节点? - ...

    经典面试题目 经典面试题目 经典面试题目 经典面试题目

    在IT行业的面试中,经典面试题目是评估求职者技能、经验和知识深度的重要工具。这些题目通常涵盖编程语言、数据结构、算法、操作系统、数据库、网络、软件工程等多个方面。以下是一些可能出现的经典面试题目及其详细...

    轻松搞定面试中的链表题目

    以上是链表面试题目的详解,掌握这些知识点,可以在面试中展现出扎实的编程基础和问题解决能力。链表题目虽然简单,但涵盖了许多编程和逻辑思维的基础,因此对于求职者来说,熟练掌握链表操作至关重要。

    2018最新BAT+面试题目

    【标题】:“2018最新BAT+面试题目”涵盖了中国顶级互联网公司——百度(Baidu)、阿里巴巴(Alibaba)和腾讯(Tencent)在2018年招聘过程中的热门面试问题。这些题目旨在测试候选人在技术、逻辑思维、问题解决以及...

    有关链表的面试题

    以下是对链表及其相关面试题目的详细解析。 1. **链表的基本概念** 链表不同于数组,它不是一个连续的内存空间,而是通过节点间的指针连接起来的一系列元素。每个节点包含两部分:数据域,用于存储数据;指针域,...

    数据结构 面试 题目

    ### 数据结构面试题目解析 1. **题目一**:“链表与数组的不同之处” - 数组是顺序存储的,访问时间复杂度为O(1),但插入删除操作可能需要移动大量元素,时间复杂度为O(n)。 - 链表是链式存储,访问时间复杂度为O...

    链表题目总结1

    链表作为数据结构中的一种,其操作经常出现在编程面试和算法题目中。这里我们总结了几个关于链表的典型问题及其解题方法。 1. **返回倒数第k个节点** (剑指offer 22) - **方法一**:两次遍历法 - 首先遍历一次...

    C#的面试题目 C#面试题目

    在C#这个强大的编程语言领域,面试题目常常涵盖了多个方面的知识,包括但不限于基础语法、面向对象编程、集合与数据结构、异常处理、内存管理、多线程、泛型、LINQ、委托与事件、设计模式、.NET框架以及最新的C#版本...

    C语言链表在笔试常考题.docx

    在C语言笔试面试中,链表是一道常考题,以下是两个常见的链表题目及其解决方案。 链表逆置 链表逆置是将链表的节点顺序逆转的过程。例如,原始链表为1-&gt;2-&gt;3-&gt;4-&gt;5,逆置后的链表为5-&gt;4-&gt;3-&gt;2-&gt;1。 解决方案: `...

    华为计算机公司的面试题目

    华为公司作为全球知名的IT巨头,其面试题目常常涵盖了计算机科学和技术支持等多个领域,旨在测试应聘者的综合素质和技术能力。以下是对这些文件名所暗示的面试题目的解析和相关知识点的详细介绍: 1. **华为一道...

    微创面试题目下载中微创面试题目下载中

    【微创面试题目】涵盖的内容广泛,包括数据结构、算法、C++基础知识、线程与进程、内存管理、字符串处理、委托与反射等多个方面。以下是对这些知识点的详细说明: 1. **链表操作**: - **链表逆序**:涉及到对链表...

    07丨链表(下):如何轻松写出正确的链表代码?1

    【链表操作】如链表反转和有序链表合并是常见的面试题目,也是编程练习的重点。这些操作通常需要对指针或引用有深入的理解。链表反转涉及到改变节点的指针方向,而有序链表合并则需要在保持顺序的同时合并两个已排序...

    互联网大厂面试题目大全

    "互联网大厂面试题目大全" 在这份面试题目大全中,我们可以看到涵盖了互联网行业中的多个领域,包括算法、数据结构、操作系统、数据库、计算机网络、软件设计等等。 1.1.1 如何实现一个高效的单向链表逆序输出? ...

    谷歌百度腾讯等等各大公司面试题目

    在IT行业中,面试是检验求职者技能和潜力的重要环节,尤其对于知名公司如谷歌、百度、腾讯、迅雷、网易和华为来说,他们的面试题目往往代表着行业内的高标准和前沿技术趋势。这些公司的面试通常涵盖了算法、数据结构...

    移动技术面试题目

    "移动技术面试题目" 移动技术面试题目是一个移动公司通信类技术面试的题目汇总,涵盖了 TCP/IP、移动通信、数据传输、计算机网络、数据库设计等多个方面的知识点。 一、TCP/IP 层次结构和协议 TCP/IP 协议栈有四层...

    面试题27_二叉搜索树与双向链表

    题目“剑指offer”中的面试题27,就是关于这个转换过程。这个过程的核心在于如何通过迭代或递归的方式,保持节点的顺序,并正确设置链表中的next和prev指针。首先,我们需要理解双向链表的结构,每个节点不仅包含...

    Intel的笔试和面试题目

    ### Intel的笔试和面试题目解析 #### 智力题解析 1. **相遇轮船问题**:这个问题实际上是一个经典的数学逻辑题。由于两艘轮船分别从两个地点出发,相向而行,假设今天中午从勒阿佛开出的船会在7天后到达纽约,而在...

    常见算法面试题目有代码详解

    本资源"常见算法面试题目有代码详解"显然是一份针对算法面试的珍贵资料,涵盖了链表、图、树以及数据元素等核心概念。下面将详细阐述这些领域的关键知识点。 首先,链表是一种线性数据结构,它的元素(节点)不连续...

Global site tag (gtag.js) - Google Analytics