day02逆置/反转单链表+查找单链表的倒数第k个节点+实现一个Add函数不用四则运算

  • 逆置/反转单链表,要求只能遍历一次链表
struct Node
{
    Node *next;
    int value;

    Node(int val):value(val),next(NULL){ }
};

//方式一:
void Reverse(Node *&phead)
{
    if(phead == NULL || phead->next ==  NULL)
        return ;


    Node *pcur = phead->next;
    Node *pre = phead;

    while(pcur)
    {
        Node *pnext = pcur->next;
        pcur->next = pre;
        pre = pcur;
        pcur = pnext;
    }

    phead->next = NULL;  //最后把指针域制空
    phead = pre;
}

//方式二:用栈去实现逆置。

void  Reverse2(Node *&phead)
{
    if(phead == NULL || phead->next == NULL)
        return ;

    stack<Node*> s;

    Node *pcur = phead;
    while(pcur->next) //此时pcur指向最后一个元素,也就是逆置后的首元素。
    {
        s.push(pcur);
        pcur= pcur->next;
    }

    phead = pcur;
    while(!s.empty())
    {
        Node *ptemp = s.top();
        pcur->next = ptemp;
        pcur = ptemp;
        s.pop();
    }
    pcur->next = NULL;

}

void Reverse3( Node *&phead)
{
    if(phead == NULL || phead->next == NULL)
        return ;

    Node *pNewHead = phead;
    Node *pcur = phead->next;
    pNewHead->next = NULL;  //先把头结点的指针域制空

    while(pcur)
    {
        Node *pnext = pcur->next; //pnext = pcur->next这句话别放在最后面,放在最后面,pcur =pnext=NULL,此时pnext = NULL->next,程序崩溃。
        pcur->next = pre;
        pre = pcur;
        pcur = pnext;
    }

    phead = pNewHead;
}
  • 查找单链表的倒数第k个节点,要求只能遍历一次链表
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x):val(x),next(NULL) { }
};

ListNode *FindKthToTail(const  ListNode *pListHead, int k)
{
    assert(pListHead && k > 0);

    const ListNode *pFast = pListHead;

    while(k--)
    {
        if(pFast == NULL)
            return NULL;
        pFast = pFast->next;
    }

    const ListNode *pSlow = pListHead;
    while(pFast)
    {
        pFast = pFast->next;
        pSlow = pSlow->next;
    }

    return (ListNode*)pSlow;

}
  • 实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--等等
//一个数相加分三步:5+17  第一步:各个位相加5+7=12,个位为2,1+0=1,十位为1,第二步做进位,5+7进位为10,第三步12+10=22(也就是重复一二步)


int Add(int num1, int num2)
{

    while(num2 != 0) //进位不为0
    {
        int temp1 = (num1^num2); //各个位相加
        int temp2 = (num1&num2)<<1; //进位
        num1 = temp1;
        num2 = temp2;
    }
    return num1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值