zoukankan      html  css  js  c++  java
  • 我要好offer之 链表大总结

    单链表是一种递归结构,可以将单链表看作特殊的二叉树(我把它叫做一叉树)

    单链表的定义:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */

    1. O(1)时间删除结点

    ListNode* DeleteNode(ListNode* pHead, ListNode* deletedNode) {
        assert(pHead != NULL && deletedNode != NULL);
        ListNode newHead(-1);
        newHead.next = pHead;
        if (pHead == deletedNode) {
            newHead->next = pHead->next;
            delete deletedNode;
            deketedNode = NULL;
            return newHead.next;
        } else {
            if (deleteNode->next == NULL) {
                ListNode* cur = pHead;
                while (cur->next != deleteNode) {
                    cur = cur->next;
                }
                cur->next = NULL;
                delete deletedNode;
                deletedNode = NULL;
                return newHead.next;
            } else {
                ListNode* nextNode = deletedNode->next;
                deletedNode->val = nextNode->val;
                deletedNode->next = nextNode->next;
                delete nextNode;
                nextNode = NULL;
                return newHead.next;
            }
        }
    }

    2. 单链表反转

    ListNode* ReverseList(ListNode* pHead) {
        if (pHead == NULL || pHead->next == NULL) {
            return pHead;
        }
        ListNode* tail = pHead;
        ListNode* cur = pHead->next;
        while (cur != NULL) {
            ListNode* nextNode = cur->next;
            cur->next = pHead;
            pHead = cur;
            cur = nextNode;
        }
        tail->next = NULL;
        return pHead;
    }

    3. 单链表倒数第k个结点

    ListNode* KthNode(ListNode* pHead, int k) {
        assert(pHead != NULL && k > 0);
        ListNode* first = pHead;
        ListNode* second = pHead;
        while (first != NULL && k > 0) {
            first = first->next;
            --k;
        }
        if (first == NULL) {
            if (k == 0) {
                return pHead;
            } else {
                return NULL;
            }
        }
        while (first != NULL) {
            first = first->next;
            second = second->next;
        }
        return second;
    }

    4. 单链表反转部分区间

    5. 单链表快速排序的一趟划分

    6. 单链表去掉重复元素

    7. 单链表旋转

    8. 单链表成对交换节点

    9. 有序单链表归并排序

    10. 单链表加法运算

    11. 单链表是否存在环,环的位置

    12. 两个单链表的第一个公共结点

    13. 单链表归并排序

    class Solution {
    public:
        ListNode *sortList(ListNode *head) {
            if (head == NULL || head->next == NULL) {
                return head;
            }
            
            ListNode* slow = head;
            ListNode* fast = head;
            //快慢指针找链表中间结点
            while (fast != NULL && fast->next != NULL && fast->next->next != NULL) {
                slow = slow->next;
                fast = fast->next->next;
            }
            ListNode* list1 = head;
            ListNode* list2 = slow->next;
            slow->next = NULL;
            ListNode* sortList1 = sortList(list1);
            ListNode* sortList2 = sortList(list2);
            ListNode* res = mergeSortList(sortList1, sortList2);
            return res;
        }
        
        ListNode* mergeSortList(ListNode* list1, ListNode* list2) {
            if (list1 == NULL) return list2;
            if (list2 == NULL) return list1;
            ListNode newHead(-1);
            ListNode* cur = &newHead;
            ListNode* node1 = list1;
            ListNode* node2 = list2;
            while (node1 != NULL && node2 != NULL) {
                if (node1->val <= node2->val) {
                    cur->next = node1;
                    node1 = node1->next;
                    cur = cur->next;
                } else {
                    cur->next = node2;
                    node2 = node2->next;
                    cur = cur->next;
                }
            }
            while (node1 != NULL) {
                cur->next = node1;
                node1 = node1->next;
                cur = cur->next;
            }
            while (node2 != NULL) {
                cur->next = node2;
                node2 = node2->next;
                cur = cur->next;
            }
            return newHead.next;
        }
    };
  • 相关阅读:
    Python基础数据类型二
    集合
    SourceInsight打开的工程中中文字体显示乱码的问题
    3、U-boot的环境变量: bootcmd 和bootargs
    2、qq物联环境搭建
    FTP、SSH、NFS等环境工具的安装
    1、基本概念介绍
    7、从系统角度考虑电源管理,我们要学习更多
    6、修改应用程序数码相框以支持自动关闭LCD
    5、regulator系统的概念及测试
  • 原文地址:https://www.cnblogs.com/wwwjieo0/p/3910605.html
Copyright © 2011-2022 走看看