链表

来源:互联网 发布:linux shell 输出日志 编辑:程序博客网 时间:2024/06/05 14:48

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;}
原创粉丝点击