美文网首页
单链表倒置

单链表倒置

作者: 上官宏竹 | 来源:发表于2021-07-21 17:08 被阅读0次

题目:将一个单链表倒置,1->2->3->4倒置成4->3->2->1
题目并不难,关键是在面试中思路要清晰。

思路

一定要寻找一个通用场景来完成主代码的测试编写。

结构体定义

面试中简单画了一个图,只尝试了前面两个数的倒置,写成如下:
定义的结构体如下,缺点未使用typedef或者现实好构造函数。

struct mlist
{
    int data;
    struct mlist* next;
};

最好定义如下这种,实现下构造函数,在测试时不需要再给data复制。

struct MyList {
    int data;
    MyList* next;
    MyList(int a) : data(a), next(nullptr) {}
};

错误的主函数

主函数的实现过程有严重的错误,只考虑了第一个和第二个元素的倒置,缺丢失了后面元素的倒置,导致这里存在死循环。

struct mlist* fun(struct mlist* h)
{
    struct mlist* p = h->next;

    while (p != nullptr) {
        h->next = p->next;
        p->next = h;
        h = p;
        p = h->next;
    }
    return h;
}
错误的代码运行示意图

正确的主函数

一般的场景是:链表头h指针指向链表头,当前需要被倒置的节点p指向链表中间任何一个节点(这就出现了测试边界值:p指向头节点后一个节点,p指向中间某个一个节点,p指向最后一个节点)

MyList* fun(MyList* h)
{
    if (h == nullptr) {
        return h;
    }
    MyList* p = h->next;
    MyList* p1;
    MyList* p2;
    MyList* prep = h;

    while (p != nullptr) {
        p1 = p->next;
        p2 = prep;

        prep->next = p->next;
        p->next = h;
        h = p;
        
        prep = p2;
        p = p1;
    }

    return h;
}

void print(MyList* h)
{
    MyList* p = h;
    while (p != nullptr) {
        cout << p->data << endl;
        p = p->next;
    }
    cout << endl;
}

int main()
{
    MyList a(1);
    MyList b(2);
    MyList c(3);
    MyList d(4);

    a.next = &b;
    b.next = &c;
    c.next = &d;

    print(&a);
    MyList* h = fun(&a);
    print(h);

    return 0;
}

相关文章

  • 单链表倒置

    题目:将一个单链表倒置,1->2->3->4倒置成4->3->2->1题目并不难,关键是在面试中思路要清晰。 思路...

  • 倒置链表

    题目描述:给出单向链表的头节点l,如何只遍历一次就将链表中的所有元素倒转。 算法描述: 首先给出单向链表的结构 遍...

  • 单链表 C++

    单链表 C++ 题目 1、创建单链表2、初始化单链表3、释放单链表4、获取单链表中元素的数量5、输出单链表中的所有...

  • 线性表:顺序表和链表

    顺序表(数组)优缺点 链表优点 单链表使用 单链表结构 单链表初始化 单链表初始化 单链表建立: 头插法 尾插法 ...

  • 单向链表算法

    单向链表 反转单向链表 单链表查找倒数第k个节点 单链表递归倒序打印 单链表排序 单链表删除重复节点

  • 链表基本操作

    1、删除单链表节点 2、插入单链表结点 单链表具体实现

  • 25_静态单链表的实现

    关键词: 单链表的一个缺点、静态单链表设计思路、静态单链表的继承层次结构、静态单链表的实现思路、静态单链表的实现 ...

  • 线性表的链式存储-单链表

    单链表操作 [x] 单链表的创建(尾插法、头插法) [x] 单链表的查找操作 [x] 单链表的删除操作 [x] 单...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

  • 单链表反转

    单链表 单链表反转 递归方法

网友评论

      本文标题:单链表倒置

      本文链接:https://www.haomeiwen.com/subject/qdpjmltx.html