放暑假了,笔者趁这这段时间梳理一遍数据结构,今天咱们先看一看基本的数据结构--链表。相对来讲,我更喜欢从实际问题去理解
数据结构
这种抽象的概念。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个节点,求中间节点等。熟练掌握这些你就学会链表这一结构,为之后的学习打下基础!