链表
反转链表-递归法
思路:
这种方法其实是一直嵌套直到最后一个,得到返回值之后就一层一层退出来
反转链表-迭代法
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null){
return head;
}
if(head.next==null){
return head;
}
ListNode pre=null;
ListNode cur=head;
ListNode temp;
while(true){
temp=cur.next;
if(temp==null){
cur.next=pre;
return cur;
}
cur.next=pre;
pre=cur;
cur=temp;
}
}
}
利用三个指针,每一次都可以记录到前一个,这一个以及下一个的地址
两两交换-递归法
// 递归版本
class Solution {
public ListNode swapPairs(ListNode head) {
// base case 退出提交
if(head == null || head.next == null) return head;
// 获取当前节点的下一个节点
ListNode next = head.next;
// 进行递归
ListNode newNode = swapPairs(next.next);
// 这里进行交换
next.next = head;
head.next = newNode;
return next;
}
}
删除倒数第n个节点
代码可以不用设置虚节点,但是要用两个指针,一个fast先移动n,再同时移动,直到fast到最有一个节点,这时slow的下一个节点就是要删除的节点;注意上述是一般情况,考虑倒数n可能是头节点,这时候fast指针是空的,需要额外判断
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast=head;
ListNode slow=head;
for(int i=1;i<=n;i++){
fast=fast.next;
}
if(fast==null){
head=slow.next;
return head;
}
while(fast.next!=null){
slow=slow.next;
fast=fast.next;
}
slow.next=slow.next.next;
return head;
}
}
环形链表入环节点
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast=head;
ListNode slow=head;
while(fast!=null&&fast.next!=null){//保证链表中存在环才进行下面操作
fast=fast.next.next;
slow=slow.next;
if(fast==slow){//快慢指针相遇的节点
ListNode meet=fast;
while(head!=meet){//head出发与meet点出发以相同速度碰头的点就是入环点
head=head.next;
meet=meet.next;
}
return meet;
}
}
return null;
}
}
KMP算法
字符串匹配字符串的算法
长度为前1个字符的子串a
,最长相同前后缀的长度为0。(注意字符串的前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串;后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。)
最开始i为0 j为1 对应字符相等 则i和j都后移判断下一个i和j对应字符是否相等
二叉树递归
其中确定单层逻辑时,考虑访问顺序,以及考虑左子节点满足要求时怎么做,不满足要求时进行迭代等要素