回文系列
寻找回文串 –> 双指针从两端向中间逼近
寻找一个字符串中最大回文串 –> 寻找以s[left]和s[right]为中心的最长回文串 (中间向两端逼近)
判断回文单链表
思路1:将单链表的值放到数组中,然后通过数组来判断
思路2:反转单链表,判断两个链表是否完全相同
思路3:利用二叉树后序遍历思路
1 | ListNode left=null; |
思路4:优化空间复杂度
- 先找到链表的中点 使用快慢指针
- 反转后半部分链表
1 | public boolean isPalindrome(ListNode head) { |
反转链表
如何反转单链表? 剑指 Offer 24. 反转链表
依靠栈
头插法,把原链表一个一个摘下,插入到新链表前面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public ListNode ReverseList(ListNode head) {
if(head==null || head.next==null){
return head;
}
ListNode p=head.next;
ListNode pre=head;
pre.next=null;
while(p!=null){
ListNode s=p;
p=p.next;
s.next=pre;
pre=s;
}
return pre;
}递归
递归的空间复杂度为O(N),而迭代的时间复杂度为O(1).
递归反转整个链表
==递归最重要的就是明确递归函数的含义==
ListNode reverse(ListNode head) // 输入单链表头结点,将该头结点的整个链表反转,返回新的头结点

1 | public ListNode ReverseList(ListNode head) { |
递归方式,代码简洁优雅
递归反转部分链表
reverseBetween(ListNode head, int left, int right) //输入单链表头结点,将链表的第left结点到第right结点反转,返回新链表的头结点
首先,考虑如何反转前n个结点

1 | ListNode successor=null; |
解决:递归反转部分链表
left=1 就想当于反转前n个结点
left!=1 前进到反转的起点
1 | public ListNode reverseBetween(ListNode head, int left, int right) { |
k个一组反转链表
递归解决

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小沙同学个人博客!

