從小問題看懂鏈表

從小問題看懂鏈表

前言

放暑假了,筆者趁這這段時間梳理一遍數據結構,今天咱們先看一看基本的數據結構--鏈表。相對來講,我更喜歡從實際問題去理解 數據結構 這種抽象的概念。music,讓咱們開始吧!數據結構

第一問-迴文字符串

請判斷一個鏈表是否爲迴文鏈表。學習

示例 1:spa

輸入: 1->2
輸出: false指針

示例 2:code

輸入: 1->2->2->1
輸出: trueleetcode

進階:
你可否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?字符串

  • 思路get

    因爲要在 O(1) 的空間複雜度內解決次問題,因此我天然想到了雙指針法。it

    步驟:

    1. 使用快慢兩個指針,慢指針邊走邊逆序,當快指針到底時,字符串的前半部分完成逆序。
    2. 意義對比兩部分便可
  • 代碼

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public boolean isPalindrome(ListNode head) {
            if(head==null||head.next==null) return true;
            ListNode prev = null;
            ListNode slow = head;
            ListNode fast = head;
            ListNode next = null;
            while(fast!=null&&fast.next!=null){
                fast = fast.next.next;
                next = slow.next;
                slow.next = prev;
                prev = slow;
                slow = next;
            }
    
            if(fast!=null){
                slow = slow.next;
            }
            while(slow!=null){
                if(slow.val!=prev.val) return false;
                slow = slow.next;
                prev = prev.next;
            }
            return true;
        }
    }

第二問-環形鏈表

Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?

  • 思路:

    一樣是快慢指針法,若是兩指針能相遇則有環

  • 代碼:

    public boolean hasCycle(ListNode head){
        if(!head) return false;
        ListNode fast = head;
        ListNode slow = head;
        while(fast.next!=null && fast.next.next!=null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow)
                return true;
        }
        return false;
    }

總結

固然有關鏈表的題目有不少,你們能夠本身去各大 OJ (leetcode等) 發掘,相相似的問題還有,單鏈表的反轉,兩個有序鏈表的合併,刪除鏈表的倒數第n個節點,求中間節點等。熟練掌握這些你就學會鏈表這一結構,爲之後的學習打下基礎!

相關文章
相關標籤/搜索