链表

1.输入一个链表,从尾到头打印链表每个节点的值

vector<int> printListFromTailToHead(ListNode* head) 
{
    vector<int> dst;
    while (head != nullptr)
    {
        dst.push_back(head->val);
        head = head->next;
    }
    reverse(dst.begin(), dst.end());//反转vector
    return dst;

    //或者使用反向迭代器
    //return vector<int>(dst.rbegin(),dst.rend());
}

2.输入一个链表,反转链表后,输出链表

为了效率,这里使用头插法
ListNode* ReverseList(ListNode* pHead) 
{
    //头插法
    ListNode* dst = nullptr;
    while (pHead != nullptr)
    {
        ListNode* tmp = pHead->next;
        pHead->next = dst;
        dst = pHead;
        pHead = tmp;
    }
    return dst;
}

3.输入一个链表,输出该链表中倒数第k个结点

//两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走
//(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾
//的时候,第二个结点所在位置就是倒数第k个节点了

ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
    ListNode* first, *second;
    first = second = pListHead;
    int i = 0;
    while (first != nullptr)
    {
        if (i >= k)
            second = second->next;
        first = first->next;
        ++i;
    }
    return i < k ? nullptr : second;
}

4.删除排序链表中重复的结点

例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
//建立一个头结点,就简单了很多
ListNode* deleteDuplication(ListNode* pHead)
{
    if (pHead == NULL || pHead->next == NULL)
        return pHead;

    /*---------先为链表创建一个头结点---------*/

    int firstNumber = pHead->val;

    //假设我的头结点数值为-1
    int myFirst = -1;

    //万一链表的头结点也为-1,那么我就改成-2
    if (myFirst == firstNumber)
    {

        myFirst = -2;
    }
    ListNode *head = new ListNode(myFirst);
    head->next = NULL;
    head->next = pHead;

    //使用两个指针来对链表进行遍历
    ListNode *p = head;
    ListNode *q = head->next;

    while (q)
    {
        while (q->next && (q->next->val == q->val))//有重复的时候,去掉前面那个值
        {
            q = q->next;
        }
        if (p->next != q)//删除重复时候的最后一个,并和p连接起来
        {

            q = q->next;
            p->next = q;
        }
        else
        {
            p = q;
            q = q->next;
        }
    }

    //返回的时候,注意去掉头结点(自己创建的辅助节点)
    return head->next;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值