List

今天研究了一下markdown的语法才发现还有一种可以划分出区域的方法。
链表是一种很常见的数据结构,那么我们就复习一下,使用C++现撸出一个linkedlist

#include <iostream>
using namespace std;

// Node类,封装了一些常用的操作
template <typename T>
class Node{
public:
    //构造函数
    Node();
    Node(T data);
    //析构函数
    ~Node();

    void setData(T data);
    T getData();
    void setNext(Node<T> *next);
    Node* getNext();
    void printData();
private:
    T* m_tpData;
    Node<T> *m_tpNext;
}

template <typename T>
// 不带参数的构造函数
Node<T>::Node(){
    m_tpData = new T;
    m_tpNext = NULL;
}
// 带参数的构造函数
template<typename T>
Node<T>::Node<T data>{
    m_tpData = new T(data);
    m_tpNext = NULL;
}

template<typename T>
Node<T>::~Node(){
    delete m_tpData;
    m_tpNext = NULL;
}

template<typename T>
void Node<T>::setData(T data){
    *m_tpData = data;
}

template<typename T>
T Node<T>::getData(){
    return *m_tpData;
}

template<typename T>
void Node<T>::setNext(Node<T>* next){
    m_tpNext = next;
}

template <typename T>
Node<T>* Node<T>::getNext(){
    return m_tpNext;
}

template <typename T>
void Node<T>::printData(){
    cout << *m_tpData << endl;
}

template<typename T>
class LinkList{
public:
    LinkList();
    ~LinkList();
    bool isListEmpty();
    bool clearList();
    int getListLength();
    int getElemIndex(T &elem);
    bool getListElem(int index,T* elem);

    bool ListInsert(int index,T &elem);
    bool ListDelete(int index,T *elem);
    void ListPrint(void);
private:
    Node<T>* m_pList;
    int m_iLength;
}

template<typename T>
LinkList<T>::LinkList(){
    m_pList = new Node<T>;
    m_pList->setData(NULL);
    m_pList->setNext(NULL);
    m_iLength = 0;
}

template <typename T>
LinkList<T>::~LinkList(){
    Node<T> *nextNode = m_pList;
    while( nextNode -> getNext() != NULL){
        nextNode = m_pList -> getNext();
        delete m_pList;
        m_pList = nextNode;
    }
    delete m_pList;
    m_pList = NULL;
}

template <typename T>
bool LinkList<T>::isListEmpty(){
    return m_iLength == 0 ? true : false;
}

template <typename T>
bool LinkList<T>::clearList(){
    if(isListEmpty()){
        cout << "List is empty, clear fail." << endl;
    }
    // delete all nodes except the first one
    Node<T>* nowNode = m_pList->getNext();
    Node<T>* nextNode = m_pList->getNext();
    while(nextNode -> getNext() != NULL){
        nextNode = nowNode -> getNext();
        delete nowNode;
        nowNode = nextNode;
    }
    delete nowNode;

    // reset the list length
    m_iLength = 0;
    m_pList -> setNext(NULL);
    return true;
}

template <typename T>
int LinkList<T>::getListLength()
{
    return m_iLength;
}

template <typename T>
int LinkList<T>::getElemIndex(T &elem){
    // 获取元素的索引
    Node<T>* tempNode = m_pList;
    for(int i=0; i<m_iLength; i++){
        tempNode = tempNode -> getNext();
        if( tempNode-> getData() == elem ) return i;
    }
    // 没有找到
    return -1;
}

template <typename T>
bool LinkList<T>::getListElem(int index,T* elem){
        if( index < 0 || index >= m_iLength){
            return false;
        }

        Node<T>* tempNode = m_pList;
        for( int i=0; i<index; i++){
            tempNode = tempNode -> getNext();
        }
        *ele = tempNode -> getData();
        return true;
}


Leetcode上也有许多与链表相关的问题,我们来一一击破

Remove Nth Node From End of List

Given a linked list, remove the n-th node from the end of list and return its head.

Example:
Given linked list: 1->2->3->4->5, and n = 2.

After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:

Given n will always be valid.

Follow up:

Could you do this in one pass?

这道题目是典型的双指针问题,我们只要设置两个指针就很容易完成。

eg:
array = {1, 2, 3, 4, 5, 6} n = 2 
initial phase
array           1 2 3 4 5 6
pre             ^       
tempNode        ^

offset tempNode  n steps
array           1 2 3 4 5 6
pre             ^       
tempNode            ^

both pointers start to move forward until tempNode meets the end
array           1 2 3 4 5 6
pre                   ^       
tempNode                  ^

do pre->next = pre->next->next to delete the element 

array           1 2 3 4 6
pre                     ^       
tempNode                ^

代码如下, 要注意一下边界条件的判断

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if (!head->next) return NULL;
        // baecause n is always valid, so ignore the judge
        ListNode* tempNode = head, *pre = head;
        // offset tempNode 
        for(int i=0; i<n; i++){
            tempNode = tempNode -> next;
        }
        // 如果已经移到NULL上
        if ( !tempNode ) return head->next;
        // go through the list together
        while( tempNode  != NULL ){
            if( tempNode -> next == NULL ){
                pre -> next= pre -> next -> next;
            }
                tempNode = tempNode -> next;
                pre = pre -> next;
          
        }
    return head;
    }
};

Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example:

Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6

暴力的解法就是直接每次都对k个链表进行遍历并且比较,拿到当前链表头上最小的数进行插入,这种方法时间复杂度应该是O(n^2),按照leetcode的尿性肯定会超时,所以就直接抛弃掉。
下面可以想想一些典型的O(nlgn)的思路。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容