599. 向循環(huán)有序鏈表插入節(jié)點

描述

給一個來自已經(jīng)排過序的循環(huán)鏈表的節(jié)點辨宠,寫一個函數(shù)來將一個值插入到循環(huán)鏈表中,并且保持還是有序循環(huán)鏈表背零。給出的節(jié)點可以是鏈表中的任意一個單節(jié)點购岗。返回插入后的新鏈表。

注意事項

3->5->1 是一個循環(huán)鏈表门粪,所以 3 是 1 的下一個節(jié)點喊积。3->5->1 與 5->1->3 相同

樣例

給一個鏈表:3->5->1
插入值 4
返回 5->1->3->4

思路

循環(huán)鏈表的插入要考慮四種情況:

  1. 鏈表為空
  2. 鏈表只有一個結(jié)點
  3. 鏈表值不全部相等時的兩種插入:
    a. 順序排列的合適位置
    b. 最大值最小值的中間插入
  4. 鏈表值全部相等時,在表頭或表尾的任意插入

代碼

  1. version1
/**
 * Definition for ListNode
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    /**
     * @param node a list node in the list
     * @param x an integer
     * @return the inserted new list node
     */
    public ListNode insert(ListNode node, int x) {
        // 鏈表為空時,新建一個結(jié)點,node.value = x,結(jié)點的next指針指向自己
        if (node == null) {
            node = new ListNode(x);
            node.next = node;
            return node;
        }
       
        // 在鏈表內(nèi)部尋找合適的插入位置
        // current是當前結(jié)點玄妈,node是鏈表頭結(jié)點
        ListNode current = node;
        ListNode prev = null;
        do {
            /* prev和current都向后移一位
             * 不能寫成prev.next = current;
             * 如果是普通鏈表可能問題不大乾吻,但循環(huán)鏈表的話會出問題,
             * 因為循環(huán)鏈表實際上就是一個環(huán)形鏈表拟蜻,
             * 沒有頭尾绎签,這種情況下給某一個結(jié)點在外面加了一個新的連接結(jié)點,
             * 在遍歷循環(huán)鏈表時一定會出現(xiàn)超時
             */
            prev = current;
            current = current.next;
            // 兩種滿足條件的插入情況酝锅,用break結(jié)束循環(huán)
            if (x <= current.val && x >= prev.val) { 
                break;
            }
            if ((prev.val > current.val) && (x < current.val || x > prev.val)) {
                break;
            }
        // 剛開始current = node,不斷后移,若current再次等于node則證明遍歷整個鏈表一圈
        } while (current != node);
        
        // 鏈表內(nèi)部位置都不滿足條件诡必,可以說明鏈表都是值一樣的結(jié)點,直接在邊緣插入
        // 創(chuàng)建新結(jié)點搔扁,把新結(jié)點插入到合適的位置
        ListNode newNode = new ListNode(x);
        newNode.next = current;
        prev.next = newNode;
        return newNode;
    }
}
  1. version2 不用do while 邏輯更清晰些
/**
 * Definition for ListNode
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */


public class Solution {
    /*
     * @param node: a list node in the list
     * @param x: An integer
     * @return: the inserted new list node
     */
    public ListNode insert(ListNode node, int x) {
        // 鏈表為空
        if (node == null) {
            node = new ListNode(x);
            node.next = node;
            return node;
        }
        
        ListNode current = node;
        ListNode prev = null;
        
        // 鏈表只有一個結(jié)點
        prev = current;
        current = current.next;
        if (current == node) {
            ListNode newNode = new ListNode(x);
            current.next = newNode;
            newNode.next = current;
        }
        
        // 鏈表結(jié)點值不全部相等
        // 當鏈表值相等時爸舒,下面的 if 根本不會執(zhí)行
        while (current != node) {
            if ((prev.val <= x && x <= current.val) || 
                (prev.val > current.val && (prev.val < x || x < current.val))) {
                ListNode newNode = new ListNode(x);
                prev.next = newNode;
                newNode.next = current;
                break;
            }
            prev = current;
            current = current.next;
        }
        
        // 鏈表結(jié)點值全部相等
        ListNode newNode = new ListNode(x);
        prev.next = newNode;
        newNode.next = current;
        
        return node;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市稿蹲,隨后出現(xiàn)的幾起案子扭勉,更是在濱河造成了極大的恐慌,老刑警劉巖苛聘,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涂炎,死亡現(xiàn)場離奇詭異忠聚,居然都是意外死亡,警方通過查閱死者的電腦和手機唱捣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門两蟀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爷光,你說我怎么就攤上這事垫竞。” “怎么了蛀序?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵欢瞪,是天一觀的道長。 經(jīng)常有香客問我徐裸,道長遣鼓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任重贺,我火速辦了婚禮骑祟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘气笙。我一直安慰自己次企,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布潜圃。 她就那樣靜靜地躺著缸棵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谭期。 梳的紋絲不亂的頭發(fā)上堵第,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音隧出,去河邊找鬼踏志。 笑死,一個胖子當著我的面吹牛胀瞪,可吹牛的內(nèi)容都是我干的针余。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼凄诞,長吁一口氣:“原來是場噩夢啊……” “哼涵紊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幔摸,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤摸柄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后既忆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驱负,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡嗦玖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了跃脊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宇挫。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖酪术,靈堂內(nèi)的尸體忽然破棺而出器瘪,到底是詐尸還是另有隱情池凄,我是刑警寧澤面哼,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站揭朝,受9級特大地震影響庐舟,放射性物質(zhì)發(fā)生泄漏欣除。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一挪略、第九天 我趴在偏房一處隱蔽的房頂上張望历帚。 院中可真熱鬧,春花似錦杠娱、人聲如沸挽牢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卓研。三九已至,卻和暖如春睹簇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寥闪。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工太惠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疲憋。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓凿渊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缚柳。 傳聞我的和親對象是個殘疾皇子埃脏,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

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