劍指Offer編程題(3)反轉(zhuǎn)鏈表

1. 反轉(zhuǎn)鏈表

題目描述

輸入一個鏈表图谷,反轉(zhuǎn)鏈表后主之,輸出新鏈表的表頭变汪。

分析

定義兩個節(jié)點next:保存當前節(jié)點(head)的下一個節(jié)點(head.next)因為下面需要讓head.next指向pre,防止鏈表斷裂

pre:當前節(jié)點的前一個節(jié)點用來讓head.next指向pre


代碼

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
  public ListNode ReverseList(ListNode head) {
    ListNode next = null;
    ListNode pre = null;
    while(head!=null){
      next = head.next;
      head.next = pre;
      pre = head;
      head = next;
    }
    return pre;
  }
}

2. 合并兩個排序的鏈表

題目描述

輸入兩個單調(diào)遞增的鏈表,輸出兩個鏈表合成后的鏈表催首,當然我們需要合成后的鏈表滿足單調(diào)遞增規(guī)則。

分析

  • 定義一個鏈表它就是需要返回的合并鏈表
  • 定義一個輔助節(jié)點,用來拼接鏈表
  • 當兩個鏈表都不為空時,比較當前節(jié)點的值的大小,如果list1.val<list2.val
  • 把輔助節(jié)點指向list1節(jié)點,并讓list1節(jié)點后移,如果list1.val>=list2.val,反之
  • 最后讓輔助節(jié)點后移,當有一個鏈表的list節(jié)點為null時
  • 讓輔助節(jié)點指向另一個list節(jié)點,返回頭節(jié)點的next

代碼

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
  public ListNode Merge(ListNode list1,ListNode list2) {
    ListNode head = new ListNode(-1);
    ListNode cur = head;
    while(list1!=null&&list2!=null){
      if(list1.val<list2.val){
        cur.next = list1;
        list1 = list1.next;
      }else{
        cur.next = list2;
        list2 = list2.next;
      }
      cur = cur.next;
    }
    if(list1!=null)cur.next = list1;
    if(list2!=null)cur.next = list2;
    return head.next;  
  }
}
//遞歸解法每次返回最小的節(jié)點
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if (list1 == null) return list2;
        if (list2 == null) return list1;
        if (list1.val < list2.val) {
            list1.next = Merge(list1.next, list2);
            return list1;
        } else {
            list2.next = Merge(list1, list2.next);
            return list2;
        }
    }
}

3. 樹的子結(jié)構(gòu)

題目描述

輸入兩棵二叉樹A泄鹏,B郎任,判斷B是不是A的子結(jié)構(gòu)。(ps:我們約定空樹不是任意一個樹的子結(jié)構(gòu))

分析

  • 這棵大樹的子結(jié)構(gòu)有:

    • 4 和 5 對應(yīng)的兩棵子樹

    • 3 本身自己完整的一棵樹

  • 而里面的小框圈出來的不是 3 這棵大樹的子樹备籽!

  • 理解后可以寫代碼了舶治,如果子樹先達到 null ,那么一定是其子樹

代碼

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
  public boolean HasSubtree(TreeNode root1,TreeNode root2) {
    if(root1 == null || root2 == null){
      return false;
    }
    return judgeSubTree(root1, root2)||judgeSubTree(root1.left, root2)||judgeSubTree(root1.right, root2);
  }
  private boolean judgeSubTree(TreeNode root1,TreeNode root2){
    //如果Tree2已經(jīng)遍歷完了都能對應(yīng)的上车猬,返回true
    if(root2 == null){
      return true;
    }
    //如果Tree2還沒有遍歷完霉猛,Tree1卻遍歷完了。返回false
    if(root1 == null){
      return false;
    }
    //如果其中有一個點沒有對應(yīng)上珠闰,返回false
    if(root1.val != root2.val){
      return false;
    }
    //如果根節(jié)點對應(yīng)的上惜浅,那么就分別去子節(jié)點里面匹配
    return judgeSubTree(root1.left, root2.left)&&judgeSubTree(root1.right, root2.right);
  }
}

4. 二叉樹的鏡像

題目描述

操作給定的二叉樹,將其變換為源二叉樹的鏡像伏嗜。

分析

  • 如果當前根節(jié)點為null,return;當前根節(jié)點的左節(jié)點和右節(jié)點都為null,return
  • 定義一個輔助變量,保存root.left,方便交換左右節(jié)點
  • 接著判斷當前根節(jié)點的左節(jié)點是否為空,不為空把它當作根節(jié)點進行遞歸
  • 右節(jié)點同理

代碼

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
  public void Mirror(TreeNode root) {
    if(root == null){
      return;
    }
    if(root.left == null&&root.right == null){
      return;
    }
    TreeNode tn = root.left;
    root.left = root.right;
    root.right = tn;
    if(root.left != null){
      Mirror(root.left);
    }
    if(root.right != null){
      Mirror(root.right);
    }
  }
}

5. 順時針打印矩陣

題目描述

輸入一個矩陣坛悉,按照從外向里以順時針的順序依次打印出每一個數(shù)字,例如承绸,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數(shù)字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

分析

簡單來說裸影,就是不斷地收縮矩陣的邊界

定義四個變量代表范圍,up军熏、down轩猩、left、right

原文連接

  1. 向右走存入整行的值荡澎,當存入后均践,該行再也不會被遍歷,代表上邊界的 up 加一摩幔,同時判斷是否和代表下邊界的 down 交錯
  2. 向下走存入整列的值浊猾,當存入后,該列再也不會被遍歷热鞍,代表右邊界的 right 減一葫慎,同時判斷是否和代表左邊界的 left 交錯
  3. 向左走存入整行的值,當存入后薇宠,該行再也不會被遍歷偷办,代表下邊界的 down 減一,同時判斷是否和代表上邊界的 up 交錯
  4. 向上走存入整列的值澄港,當存入后椒涯,該列再也不會被遍歷,代表左邊界的 left 加一回梧,同時判斷是否和代表右邊界的 right 交錯

代碼

import java.util.ArrayList;
public class Solution {
  public ArrayList<Integer> printMatrix(int [][] matrix) {
    ArrayList<Integer> list = new ArrayList<Integer>();
    if(matrix == null || matrix.length==0){
      return list;
    }
    int up = 0;
    int down = matrix.length-1;
    int left = 0;
    int right = matrix[0].length-1;
    while(true){
      //向右
      for(int i = left;i<=right;i++){
        list.add(matrix[up][i]);
      }
      if(++up>down){
        break;
      }
      //向下
      for(int i = up;i<=down;i++){
        list.add(matrix[i][right]);
      }
      if(--right<left){
        break;
      }
      //向左
      for(int i = right;i>=left;i--){
        list.add(matrix[down][i]);
      }
      if(--down<up){
        break;
      }
      //向上
      for(int i = down;i>=up;i--){
        list.add(matrix[i][left]);
      }
      if(++left>right){
        break;
      }
    }
    return list;
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末废岂,一起剝皮案震驚了整個濱河市祖搓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湖苞,老刑警劉巖拯欧,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異财骨,居然都是意外死亡镐作,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門隆箩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來该贾,“玉大人,你說我怎么就攤上這事捌臊⊙畹埃” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵理澎,是天一觀的道長六荒。 經(jīng)常有香客問我,道長矾端,這世上最難降的妖魔是什么掏击? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮秩铆,結(jié)果婚禮上砚亭,老公的妹妹穿的比我還像新娘。我一直安慰自己殴玛,他們只是感情好捅膘,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滚粟,像睡著了一般寻仗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凡壤,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天署尤,我揣著相機與錄音,去河邊找鬼亚侠。 笑死曹体,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的硝烂。 我是一名探鬼主播箕别,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了串稀?” 一聲冷哼從身側(cè)響起除抛,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎母截,沒想到半個月后到忽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡微酬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年绘趋,在試婚紗的時候發(fā)現(xiàn)自己被綠了颤陶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颗管。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖滓走,靈堂內(nèi)的尸體忽然破棺而出垦江,到底是詐尸還是另有隱情,我是刑警寧澤搅方,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布比吭,位于F島的核電站,受9級特大地震影響姨涡,放射性物質(zhì)發(fā)生泄漏衩藤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一涛漂、第九天 我趴在偏房一處隱蔽的房頂上張望赏表。 院中可真熱鬧,春花似錦匈仗、人聲如沸瓢剿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽间狂。三九已至,卻和暖如春火架,著一層夾襖步出監(jiān)牢的瞬間鉴象,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工何鸡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炼列,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓音比,卻偏偏與公主長得像俭尖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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