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

一、逆置/反转单链表
逆置一个单链表和从尾到头打印不一样,打印不改变节点的位置,只是将数据反着打印一遍,而逆置就是要改变节点的位置。
可以先创建一个空节点,然后从第一个开始每次在单链表上拿一个节点,前插给创建的节点,单链表的头结点往后移,创建的新节点往前移。当单链表为空的时候,也就逆置完了。
这里写图片描述
这里面我们需要三个指针分别是cur,用来顺序遍历整个链表,nextNode指针用来保存逆置的头结点,pre用来逆序遍历链表.
步骤:
1:先遍历整个链表找到当前节点的下一个节点为空,即为尾节点也是逆置后的头结点
2:pre用来保存当前节点的上一个节点.
3:然后更新节点的位置,把当前节点指针指向前一个节点,再把它的下一个指针指向当前位置,这样就可以保证所有节点链在一起了.
1)、节点的结构:

#define NULL  0
typedef int DataType;
typedef struct Node
{
    DataType _data;
    struct Node* _pNext;
}Node,*PNode;

2)、逆置链表

 PNode ReverseList(PNode pHead)
{
    //1.单链表为空或只有一个节点,直接返回
    //2.链表有多个节点
    PNode curNode = pHead;  //curNode -> 找到当前结点的下一个节点为空
    PNode preNode = NULL; //preNode -> 保存当前结点的上一个结点
    PNode nextNode = NULL;
    while (curNode != NULL)
    {
       PNode _next = curNode->_pNext;
       if ( NULL == _next)
           nextNode = curNode;  //nextNode -> 逆置后的头结点
       curNode->_pNext = preNode;
       preNode = curNode;  //更新当前结点的位置
       curNode = _next;
    }
     return nextNode;
}

链表逆置结果:
这里写图片描述
二、查找单链表的倒数第k个节点,要求只能遍历一次链表
这里写图片描述

 typedef int DataType;
typedef struct Node
{
    DataType _data;
    struct Node* _pNext;
}Node,*PNode;
//4.查找单链表的倒数第k个节点,要求只能遍历一次链表 
PNode FindLastKNode(PNode pHead, size_t k)
{
    //1.链表为空
    //2.链表元素少于K
    //3.链表元素多余K
    PNode pfast = pHead;
    PNode pslow = pHead;
    if (NULL == pHead || k <  0)
        return NULL;
    while (k--)
    {
        pfast = pfast->_pNext;  //pfast指向K的下一个节点
    }
    while (pfast)
    {
        pfast = pfast->_pNext;   //pfast -> null
        pslow = pslow->_pNext;   //pslow -> 倒数第k个节点
    }
    return pslow; //指针pslow指向倒数第K个结点
}

//2.【附加题】--实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--等等
int Add(int num1, int num2)
{
    int temp;
    while (temp = (num1&num2))
    {
        num1 = num1^num2;
        num2 = (temp<<1);
    }
    return (num1^num2);
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值