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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章