算法 - 鏈表實(shí)現(xiàn)(OC) 及簡(jiǎn)單的鏈表算法

鏈表實(shí)現(xiàn)

LinkNode.h文件 鏈表類  .m文件什么都不用寫
@interface LinkNode : NSObject
@property (nonatomic, assign) int val;
@property (nonatomic, strong, nullable) LinkNode *next;
@end

鏈表實(shí)現(xiàn)
+ (LinkNode*)arrayTransforLink:(NSArray *)array{
    LinkNode *node = [LinkNode new],*p = [LinkNode new];
    p.val = [array[0] intValue];
    node.next = p;
    for (int i = 1; i<array.count; i++) {
        LinkNode *nextNode = [LinkNode new];
        nextNode.val = [array[i] intValue];
        p.next = nextNode;
        p = p.next;
    }
    node = node.next;//刪除無用頭結(jié)點(diǎn)
    return node;
}
//實(shí)現(xiàn)一個(gè)鏈表
LinkNode *node = [LinkTool arrayTransforLink:@[@1,@2,@3,@5]];

打印鏈表

+ (void)printNode:(LinkNode *)node{
    while (node) {
        NSLog(@"%d",node.val);
        node = node.next;
    }
}

鏈表反轉(zhuǎn) (使用遞歸法)

//反轉(zhuǎn)
+(LinkNode*)reversalLink:(LinkNode *)node{
    LinkNode *p , *q, *t=node;
    while (t) {
        p = t;//淺拷貝
        t = t.next;
        p.next = q;
        q = p;
    }
    
    return q;
}

兩個(gè)有序鏈表合并為一個(gè)有序鏈表

力扣題
將兩個(gè)升序鏈表合并為一個(gè)新的 升序 鏈表并返回机隙。新鏈表是通過拼接給定的兩個(gè)鏈表的所有節(jié)點(diǎn)組成的。

輸入:l1 = [1,2,4], l2 = [1,3,4]
輸出:[1,1,2,3,4,4]
+ (LinkNode*)merge:(LinkNode *)node link:(LinkNode*)link{

    LinkNode *selfNode = link;    
    LinkNode *newNode = [LinkNode new];//記錄
    LinkNode *headNode = newNode;//頭鏈表
    while (selfNode&&node) {
        if (selfNode.val < node.val) {
            newNode.val = selfNode.val;
            
            selfNode = selfNode.next;
        }else{
            newNode.val = node.val;
            
            node = node.next;
        }
        newNode.next = [LinkNode new];
        newNode = newNode.next;
    }
    LinkNode *p = selfNode?selfNode:node;
    newNode.val = p.val;
    return headNode;
}

鏈表 兩數(shù)相加 (簡(jiǎn)單的中等難度)

力扣題 兩數(shù)相加

給你兩個(gè) 非空 的鏈表个绍,表示兩個(gè)非負(fù)的整數(shù)网棍。它們每位數(shù)字都是按照 逆序 的方式存儲(chǔ)的庶弃,并且每個(gè)節(jié)點(diǎn)只能存儲(chǔ) 一位 數(shù)字。

請(qǐng)你將兩個(gè)數(shù)相加,并以相同形式返回一個(gè)表示和的鏈表径荔。

你可以假設(shè)除了數(shù)字 0 之外垂寥,這兩個(gè)數(shù)都不會(huì)以 0 開頭颠黎。

實(shí)例一
輸入:l1 = [2,4,3], l2 = [5,6,4] 
輸出:[7,0,8]
解釋:342 + 465 = 807.
實(shí)例二:
輸入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
輸出:[8,9,9,9,0,0,0,1]

思路:

  1. 遍歷兩個(gè)鏈表獲得兩個(gè)整數(shù)
  2. 兩個(gè)整數(shù)相加
  3. 獲得總數(shù)后整數(shù)轉(zhuǎn)鏈表

缺點(diǎn):當(dāng)鏈表節(jié)點(diǎn)很多的時(shí)候會(huì)崩掉
如:

[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
[5,6,4]

// 整數(shù)轉(zhuǎn)鏈表
+ (LinkNode*)intTransforLink:(int)number{
    LinkNode *node = [LinkNode new],*p = [LinkNode new];
    node.next = p;
    if (number<10) {
        node.val = number;
        return node;
    }
    while (number) {
        int index = number%10;
        LinkNode *nextNode = [LinkNode new];
        nextNode.val = index;
        p.next = nextNode;
        p = p.next;
        number = number/10;
    }
     
    node = node.next;//刪除無用頭結(jié)點(diǎn)
    node = node.next;//刪除無用頭結(jié)點(diǎn)
    return node;
}

//實(shí)現(xiàn)代碼
    LinkNode *node = [LinkTool arrayTransforLink:@[@9,@9,@9,@9,@9,@9,@9]];
    LinkNode *node1 = [LinkTool arrayTransforLink:@[@9,@9,@9,@9]];
    double nodeValue = 0,node1Value = 0;
    int times = 1;
    while (node||node1) {
        nodeValue = node.val*times + nodeValue;
        node = node.next;
        node1Value = node1.val*times + node1Value;
        node1 = node1.next;
        times*=10;
    } 
    int totle = nodeValue + node1Value;
    LinkNode *totleLink = [LinkTool intTransforLink:totle];
    [LinkTool printNode:totleLink];

思路二:

  1. 遍歷每一個(gè)節(jié)點(diǎn)
  2. 兩個(gè)節(jié)點(diǎn)和進(jìn)位相加
  3. 是否超過10,超過則進(jìn)位1不超過則進(jìn)位0
  4. 子節(jié)點(diǎn)的創(chuàng)建依賴于兩個(gè)節(jié)點(diǎn)其中是否有子節(jié)點(diǎn)
  5. 每次判斷其中一個(gè)節(jié)點(diǎn)是否為空滞项。如果其中一個(gè)節(jié)點(diǎn)為空則判斷進(jìn)位是否為0 狭归,進(jìn)位為0則直接賦值不為空的節(jié)點(diǎn)
  6. 遍歷完后查看進(jìn)位是否為0 不為0則增加一個(gè)子節(jié)點(diǎn) 儲(chǔ)存進(jìn)位
 + (LinkNode*)addTwoNumbers:(LinkNode *)node link:(LinkNode *)node1{
    LinkNode *totleNode = [LinkNode new],*p = [LinkNode new];
    totleNode.next = p;
    int number = 0;
    
    while (node||node1) {
        if (!node && number == 0) {
            p.val = node1.val;
            p.next = node1.next;
            break;
        }
        if (!node1 && number == 0) {
            p.val = node.val;
            p.next = node.next;
            break;
        }
        int totleValue = node.val+node1.val +number;
        number = totleValue/10;
        totleValue = totleValue%10;
        p.val = totleValue;
        
        node = node.next;
        node1 = node1.next;
        if (node||node1) {
            p.next = [LinkNode new];
            p = p.next;
        }
    }
    if (number) {//判斷最后面是否有進(jìn)位
        p.next = [LinkNode new];
        p = p.next;
        p.val = number;
    }
    totleNode = totleNode.next;//移除無用頭結(jié)點(diǎn)
    return totleNode;
}

swift代碼

func addTwoNumbers(l1:LinkNode?,l2:LinkNode?) -> LinkNode {
    var node1 = l1
    var node2 = l2
     
    var totleNode = LinkNode.init(),p = LinkNode.init()
    totleNode.next = p

    var number = 0
    while ((node1 != nil)||(node2 != nil)) { 
        var totleValue = number
        if node1 != nil {
            totleValue = totleValue + node1!.val
        }else if(number == 0){
            p.val = node2!.val
            p.next = node2?.next
            break
        }
        if node2 != nil {
            totleValue = totleValue + node2!.val
        }else if(number == 0){
            p.val = node1!.val
            p.next = node1?.next
            break
        }
        number = totleValue/10
        totleValue = totleValue%10
        p.val = totleValue
        
        node1 = node1?.next
        node2 = node2?.next
        if ((node1 != nil)||(node2 != nil)) {
            p.next = LinkNode.init()
            p = p.next!
        }
    }
    
    if number != 0 {
        p.next = LinkNode.init()
        p = p.next!
        p.val = number
    }
    totleNode = totleNode.next!
    
    return totleNode
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市文判,隨后出現(xiàn)的幾起案子过椎,更是在濱河造成了極大的恐慌,老刑警劉巖戏仓,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疚宇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赏殃,警方通過查閱死者的電腦和手機(jī)敷待,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仁热,“玉大人榜揖,你說我怎么就攤上這事」傻ⅲ” “怎么了根盒?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)物蝙。 經(jīng)常有香客問我炎滞,道長(zhǎng),這世上最難降的妖魔是什么诬乞? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任册赛,我火速辦了婚禮,結(jié)果婚禮上震嫉,老公的妹妹穿的比我還像新娘森瘪。我一直安慰自己,他們只是感情好票堵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布扼睬。 她就那樣靜靜地躺著,像睡著了一般悴势。 火紅的嫁衣襯著肌膚如雪窗宇。 梳的紋絲不亂的頭發(fā)上措伐,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音军俊,去河邊找鬼侥加。 笑死,一個(gè)胖子當(dāng)著我的面吹牛粪躬,可吹牛的內(nèi)容都是我干的担败。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼镰官,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼提前!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起朋魔,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤岖研,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后警检,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡害淤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年扇雕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窥摄。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镶奉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出崭放,到底是詐尸還是另有隱情哨苛,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布币砂,位于F島的核電站建峭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏决摧。R本人自食惡果不足惜亿蒸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掌桩。 院中可真熱鬧边锁,春花似錦、人聲如沸波岛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽则拷。三九已至贡蓖,卻和暖如春曹鸠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摩梧。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工物延, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仅父。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓叛薯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親笙纤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耗溜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容