最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 八道經典面試題之鏈表題

 更新時間:2021年11月30日 16:23:58   作者:編程快樂人  
本位主要介紹了Java面試中常常遇到的八道經典鏈表問題,文中示例代碼介紹的非常詳細,具有一定的參考價值,需要的小伙伴們可以學習一下

第一題 移除鏈表元素

給你一個鏈表的頭節(jié)點 head 和一個整數 val ,請你刪除鏈表中所有滿足 Node.val == val 的節(jié)點,并返回 新的頭節(jié)點 。

輸入:head = [1,2,6,3,4,5,6], val = 6

輸出:[1,2,3,4,5]

這道題還是比較簡單的我們需要讓刪除的節(jié)點的前一個結點指向刪除節(jié)點的后一個就行。就比如cur.next==cur.next.next;。

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode header=new ListNode(-1);
        header.next=head;
        ListNode cur =header;
        while(cur.next!=null){
            if(cur.next.val==val){
                 cur.next=cur.next.next;
            }else{
                cur=cur.next;
            }
        }
return header.next;
    }
}

第二題 反轉鏈表

給你單鏈表的頭節(jié)點 head ,請你反轉鏈表,并返回反轉后的鏈表。

輸入:head = [1,2,3,4,5]

輸出:[5,4,3,2,1]

這也是一個簡單題,我們還是先弄一個尾結點,因為鏈表的最后一個結點的下一個是一個null,這道題我們可以通過一次循環(huán)讓后一個結點的下一個結點指向前一個結點。

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre =null;
        ListNode cur=head;
        while(cur!=null){
            ListNode next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
        }
      
return pre;
    }
}

第三題 鏈表的中心結點

給定一個頭結點為 head 的非空單鏈表,返回鏈表的中間結點。

如果有兩個中間結點,則返回第二個中間結點。

答:這個也是一個簡單題我們需要用到快慢指針,當快指針指完之后,慢的結點肯定是中點比如18 快的可以走9步每次走兩步走到18,慢的可以每次走一部走9步。剛好到中點。

class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode p =head;
        ListNode q =head;
        while(q!=null&&q.next!=null){
            q=q.next.next;
            p=p.next;
        }
return p;

    }
}

第四題 倒數第k個結點

輸入一個鏈表,輸出該鏈表中倒數第k個結點

輸入:

1,{1,2,3,4,5}

復制

返回值:

{5}

答:這道題也是一個簡單題,直接簡單粗暴的搞出來倒數第k個點的值就行;

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        
        ListNode cur=head;
        ListNode pre=head;
        int count=0;
        int x=0;
        
        while(cur!=null){
            
            cur=cur.next;
            count++;
        }
        if(k<0||k>count){
            return null;
        }
        while(pre!=null){
             if(x==count-k){
               break;
            }else{
            pre=pre.next;
            x++;
             }
        }
 return pre;
    }
}

這道題寫的有點麻煩了,我們也可以用快慢指針做。一個指針走5步一個走4步。

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode p=head;
        ListNode q=head;
       for(int i = 0; i < k; i++) {
           if (p != null) {
            p= p.next;
        } else {
            return null;
        }
    }
        while(p!=null){
            p=p.next;
            q=q.next;
        }
        return q;
    }
}

第五題 合并兩個有序鏈表

將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節(jié)點組成的。

輸入:l1 = [1,2,4], l2 = [1,3,4]

輸出:[1,1,2,3,4,4]

答:這道題考到了怎么將兩個鏈表合并,我們需要將兩個鏈表從大到小合并起來。

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
       ListNode dummyHead = new ListNode(0);
        ListNode cur = dummyHead;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                cur.next = l1;
                cur = cur.next;
                l1 = l1.next;
            } else {
                cur.next = l2;
                cur = cur.next;
                l2 = l2.next;
            }
        }
        // 任一為空,直接連接另一條鏈表
        if (l1 == null) {
            cur.next = l2;
        } else {
            cur.next = l1;
        }
        return dummyHead.next;
    }
}

第六題 鏈表分割

現有一鏈表的頭指針 ListNode* pHead,給一定值x,編寫一段代碼將所有小于x的結點排在其余結點之前,且不能改變原來的數據順序,返回重新排列后的鏈表的頭指針。

輸入:l1 = [1,2,1,3,2] 3

輸出:[1,2,1,2,3]

這道題比較難了需要我們創(chuàng)建兩個鏈表,一個數大與等于x的鏈表,另一個數小于x的鏈表。然后讓上一個鏈表的下一個尾結點指向下一個結點的尾巴結點。

這里我們需要用到如何將兩個鏈表合并成一個鏈表。

做題的時候先想怎么做然后在動手!

public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        if(pHead == null || pHead.next == null) {
            return pHead;
        }
        ListNode newHead = new ListNode(0);
        ListNode flagHead = new ListNode(0);
        ListNode newh = newHead;
        ListNode flagh = flagHead;
        while(pHead != null){
            if(pHead.val < x){
                newh.next = new ListNode(pHead.val);
                newh = newh.next;
            }else{
                flagh.next = new ListNode(pHead.val);
                flagh = flagh.next;
            }
            pHead = pHead.next;
        }
        newh.next = flagHead.next;
        return newHead.next;
    }
}

第七題 判斷是否回文

對于一個鏈表,請設計一個時間復雜度為O(n),額外空間復雜度為O(1)的算法,判斷其是否為回文結構。

給定一個鏈表的頭指針A,請返回一個bool值,代表其是否為回文結構。保證鏈表長度小于等于900。

1->2->2->1

返回:true

public class PalindromeList {
    public boolean chkPalindrome(ListNode head) {
        // write code here 
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null && fast.next!=null) {
            fast = fast.next.next;
            slow = slow.next;
        }
         ListNode cur=slow.next;
        while(cur!=null){
            ListNode curNext=cur.next;
            cur.next=slow;
            slow=cur;
            cur=curNext;
        }
        //3.一個從前往后,一個從后往前  如果相遇,則證明回文
        while(head!=slow){
            if(head.val!=slow.val){//先判斷值是否相等
                return false;
            }
            if(head.next==slow){//偶數情況下
                return true;
            }
            head=head.next;
            slow=slow.next;
    }
        return true;    
}

第八題 相交鏈表

給你兩個單鏈表的頭節(jié)點 headA 和 headB ,請你找出并返回兩個單鏈表相交的起始節(jié)點。如果兩個鏈表不存在相交節(jié)點,返回 null 。

可以用笨方法就是計算出來每個鏈表的個數然后讓多的先走。

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return null;
        }
                ListNode last = headB;
        while (last.next != null) {
            last = last.next;
        }
last.next = headB;

        ListNode fast = headA;
        ListNode slow = headA;

        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {
                slow = headA;
                while (slow != fast) {
                    slow = slow.next;
                    fast = fast.next;
                }
                last.next = null;
                return fast;
            }
        }
        last.next = null;
        return null;
    }
}

到此這篇關于Java 八道經典面試題之鏈表題的文章就介紹到這了,更多相關Java 鏈表題內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 關于Java Object你真的了解了嗎

    關于Java Object你真的了解了嗎

    下面小編就為大家?guī)硪黄P于Java Object你真的了解了嗎。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • SpringBoot?屬性配置中獲取值的方式

    SpringBoot?屬性配置中獲取值的方式

    這篇文章主要介紹了SpringBoot?屬性配置中獲取值的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java開發(fā)非公平鎖不可打斷源碼示例解析

    java開發(fā)非公平鎖不可打斷源碼示例解析

    這篇文章主要為大家介紹了java開發(fā)非公平鎖不可打斷源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 深入理解Spring事務原理

    深入理解Spring事務原理

    這篇文章主要帶領大家深入理解Spring事務原理,Spring事務的傳播屬性
    2016-07-07
  • Springboot使用RestTemplate調用第三方接口的操作代碼

    Springboot使用RestTemplate調用第三方接口的操作代碼

    這篇文章主要介紹了Springboot使用RestTemplate調用第三方接口,我只演示了最常使用的請求方式get、post的簡單使用方法,當然RestTemplate的功能還有很多,感興趣的朋友可以參考RestTemplate源碼
    2022-12-12
  • JSR303校驗前端傳遞的數據方式

    JSR303校驗前端傳遞的數據方式

    這篇文章主要介紹了JSR303校驗前端傳遞的數據方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • springboot操作靜態(tài)資源文件的方法

    springboot操作靜態(tài)資源文件的方法

    這篇文章主要介紹了springboot操作靜態(tài)資源文件的方法,本文給大家提到了兩種方法,小編在這里比較推薦第一種方法,具體內容詳情大家跟隨腳本之家小編一起看看吧
    2018-07-07
  • 淺談Java double 相乘的結果偏差小問題

    淺談Java double 相乘的結果偏差小問題

    下面小編就為大家?guī)硪黄獪\談Java double 相乘的結果偏差小問題。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 基于HTML5+js+Java實現單文件文件上傳到服務器功能

    基于HTML5+js+Java實現單文件文件上傳到服務器功能

    應公司要求,在HTML5頁面上實現上傳文件到服務器功能,對于我這樣的菜鳥,真是把我難住了,最后還是請教大神搞定的,下面小編把例子分享到腳本之家平臺,供大家參考
    2017-08-08
  • Java切割字符串的踩坑實戰(zhàn)記錄

    Java切割字符串的踩坑實戰(zhàn)記錄

    最近在項目中使用了java中的分割字符串,踩了一個坑,充分了展示了自己對java底層的認知有很多的不足和欠缺,下面這篇文章主要給大家介紹了關于Java切割字符串的踩坑實戰(zhàn)記錄,需要的朋友可以參考下
    2022-11-11

最新評論

旌德县| 济阳县| 绍兴县| 中方县| 邛崃市| 启东市| 新建县| 桦南县| 信宜市| 赤水市| 呈贡县| 大埔县| 扎兰屯市| 砀山县| 光山县| 九寨沟县| 皋兰县| 册亨县| 元谋县| 文安县| 龙州县| 姜堰市| 沙湾县| 文成县| 陵川县| 枝江市| 登封市| 牟定县| 定兴县| 汾阳市| 抚顺市| 蒲江县| 鹤山市| 祁阳县| 陈巴尔虎旗| 舒兰市| 大方县| 滦平县| 亳州市| 嘉峪关市| 东源县|