【C语言】单链表的相关热点面试题(包括:从尾到头打印,逆置,冒泡,寻找中间节点,倒数k节点)

原创 2016年05月30日 17:19:14


  1. 从尾到头打印单链表

void FromTailToHeadPrint(SListNode*& head)
{
    stack<SListNode*> s;
    SListNode* cur = head;
    while (cur)
    {
        s.push(cur);
        cur = cur->_next;
    }

    while (!s.empty())
    {
        cout << s.top()->_data <<"->";
        s.pop();
    }
    cout << ""<<endl;
}



2.除一个无头单链表的非尾节点

void Erase(SListNode*& head,SListNode* pos)
{
    //分情况:空节点、一个节点、两个节点、三个节点
    if (head == NULL || pos==NULL)
    {
        return;
    }
    
    if (head == pos)
    {
        free(head);
        head = NULL;
        return;
    }

    SListNode* cur = head;
    while (cur)
    {
        SListNode* next = cur->_next;
        
        if (next == pos)
        {
            //若只有两个节点,pos=next,nextnext=NULL,cur->_next = nextnext;
            //(即使题设未说明删除非尾节点)依然可以删除成功。
            SListNode* nextnext = next->_next;
            cur->_next = nextnext;
            free(next);
            next = NULL;
        }
        cur = cur->_next;
    }
}



3.逆置、反转单链表

void Reverse(SListNode*& head)
{
    if (head == NULL)
    {
        return;
    }
    SListNode* cur = head;
    SListNode* next = NULL;
    while (cur)
    {
        SListNode* tmp = cur;
        cur = cur->_next;
        tmp->_next = next;
        next = tmp;
        head = tmp;
    }
}



4.单链表冒泡排序

void BubbleSort(SListNode*& head)
{
    //空节点或一个节点直接返回
    if (head == NULL || head->_next == NULL)
    {
        return;
    }
    
    SListNode* begin = head;
    SListNode* cur = head;

    while (begin->_next)
    {        
        while (cur->_next)
        {
            if (cur->_data > cur->_next->_data)
            {
                swap(cur->_data, cur->_next->_data);
            }
            cur = cur->_next;
        }
        begin = begin->_next;
    }
}



5.查找单链表的中间节点,要求只能遍历一次链表

SListNode* FindMiddle(SListNode*& head)
{
    if (head == NULL)
    {
        return NULL;
    }
    SListNode* slow = head;
    SListNode* fast = head;

    while (fast->_next)
    {
        if (fast->_next)
        {
            fast = fast->_next;
            if (fast->_next)
            {
                fast = fast->_next;
            }
            else
            {
                return slow;
            }
            slow = slow->_next;
        }
        else
        {
            return NULL;
        }
    }
    
    return slow;
}



6.查找单链表的倒数第k个节点,要求只能遍历一次链表

SListNode* FindLastK(SListNode*& head,int k)
{
    assert(k > 0);
    if (head == NULL)
    {
        return NULL;
    }
    SListNode* slow = head;
    SListNode* fast = head;
    while (k--)
    {
        if (fast->_next)
        {
            fast = fast->_next;
        }
        else
        {
            return NULL;
        }
    }
    slow = slow->_next;
    while (fast->_next)
    {
        fast = fast->_next;
        slow = slow->_next;
    }
    return slow;
}


本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1772313

题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值

题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。 解析:思路一:遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头。也就是说第一个遍历到的结点最后一个输出,而最后一个遍历到的...
  • yanxiaolx
  • yanxiaolx
  • 2016年08月22日 00:50
  • 1587

链表的冒泡排序(节点交换法)

链表冒泡排序,可以通过修改节点值和交换节点两种方法,下面给出交换节点的方法。 #include #include struct Node{ int data; Node *next; }; ...
  • u011739410
  • u011739410
  • 2015年05月10日 10:48
  • 2254

单向链表_找出倒数第K个节点

实现一个算法,找出单向链表中倒数第K个结点。
  • z597372259
  • z597372259
  • 2014年10月23日 20:48
  • 1893

面试题15:单链表中倒数第k个节点

题目 输入一个链表,输出该链表中倒数第k个节点。比如链表是1->2->3->4->5->5,输出倒数第三个节点就是4 思路 因为单链表中每个节点的指针指向是单向的,并且还不知道这个链表有...
  • chixujohnny
  • chixujohnny
  • 2016年05月24日 12:19
  • 452

链表面试题(二):冒泡排序、合并两个有序链表、查找中间节点、查找倒数K个节点

这里接上一篇博客, 7. 单链表排序(冒泡排序&快速排序) //7.单链表排序(冒泡排序) void BubbleSort(pNode* pHead) { assert(NULL != pHead)...
  • qq_35409955
  • qq_35409955
  • 2017年06月23日 01:22
  • 229

有关单链表的两个问题【遍历一次求中间节点,倒数第K个结点】

package com.zhiru; /* * 一个无附加头结点的单向链表示例 */ public class LinkedList { private Node head; private...
  • lantiancaiyun
  • lantiancaiyun
  • 2014年09月10日 19:22
  • 656

链表面试题/逆置/反转单链表+查找单链表的倒数第k个节点

一、逆置/反转单链表 逆置一个单链表和从尾到头打印不一样,打印不改变节点的位置,只是将数据反着打印一遍,而逆置就是要改变节点的位置。 可以先创建一个空节点,然后从第一个开始每次在单链表上拿一个节...
  • s25691011
  • s25691011
  • 2017年07月15日 16:41
  • 175

单链表的创建,表长,插入,查找,逆置,中间元素,删除节点,打印

直接上代码。。。 #include #include using namespace std; struct Node { int data; Node *next; }; /*  type...
  • qq_35965090
  • qq_35965090
  • 2017年05月27日 15:15
  • 188

【面试题】从尾到头打印链表&&链表中倒数第K个结点

链表结构体: struct Node { int data; Node* next; }PNode; 从尾到头打印链表 思路:一般打印时不应该改变链表本身的结构,也就是说第一个遍历到最后一个,最后...
  • sayhello_world
  • sayhello_world
  • 2017年04月07日 21:14
  • 504

单链表的增删查 逆置 倒数第k个节点等问题

对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针。在下面本人实现了 单链表的 增   删   插  查  改。      #include #include #inclu...
  • l_tudou
  • l_tudou
  • 2016年05月26日 09:38
  • 82
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C语言】单链表的相关热点面试题(包括:从尾到头打印,逆置,冒泡,寻找中间节点,倒数k节点)
举报原因:
原因补充:

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