放暑假了,筆者趁這這段時間梳理一遍數據結構,今天咱們先看一看基本的數據結構--鏈表。相對來講,我更喜歡從實際問題去理解
數據結構
這種抽象的概念。music,讓咱們開始吧!數據結構
請判斷一個鏈表是否爲迴文鏈表。學習
示例 1:spa
輸入: 1->2
輸出: false指針示例 2:code
輸入: 1->2->2->1
輸出: trueleetcode進階:
你可否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?字符串
思路get
因爲要在 O(1) 的空間複雜度內解決次問題,因此我天然想到了雙指針法。it
步驟:
代碼
/** * 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個節點,求中間節點等。熟練掌握這些你就學會鏈表這一結構,爲之後的學習打下基礎!