剑指offer 第十四、十五题:链表中倒数第k个结点 、反转链表

十四题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路:
1.反转链表,然后求第k个节点
2.利用空间换时间,把链表每个结点都存在vector中
3.链表倒数第k个,就是正数第l-k+1个;利用两个指针,第一个先走k-1个节点,然后第二个开始一起走,这样第二个节点就走了l-k+1个。

思路2:
时间复杂度:O(n)
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if(pListHead==NULL || k==0)
            return NULL;
        vector<ListNode*> data;
        while(pListHead != NULL)
        {
            data.push_back(pListHead);
            pListHead=pListHead->next;
        }
        int len = data.size();
        if(len<k || k==0)
            return NULL;
        return data[len-k];

    }
};
思路3:
时间复杂度O(n)
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if(pListHead==NULL || k==0)
            return NULL;
        ListNode* phead=pListHead;
        ListNode* pbehind=pListHead;
        for(int i=0;i<k-1;++i)
        {
            if(phead->next !=NULL)
                phead=phead->next;
            else
                return NULL;
        }
        while(phead->next != NULL)
        {
            phead=phead->next;
            pbehind=pbehind->next;
        }
        return pbehind;

    }
};

十五题目描述
输入一个链表,反转链表后,输出新链表的表头。

时间复杂度:O(n)
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead==NULL)
            return NULL;
        ListNode* p0=pHead;
        ListNode* p1=NULL;
        while(p0!=NULL)
        {
            ListNode* temp=p0->next;
            p0->next=p1;
            p1=p0;
            p0=temp;
        }
        return p1;
    }
};

猜你喜欢

转载自blog.csdn.net/zd_nupt/article/details/80776230