链表常考操作总结:
遍历链表一般是去更新cur
即cur = cur.next
返回链表长度
public int getLength(ListNode head){
int len = 0;
while(head != null){
head = head.next;
len++;
}
return len;
}
快慢指针
定义:
当快指针移到终点时,此时慢指针恰好移动链表的某个点(取决于步差)
反转链表
206. 反转链表
public ListNode reverseList(ListNode head){
ListNode prev = null;
ListNode cur = head;
while(cur != null){
ListNode next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev;
}
找到链表的中点
234. 回文链表
public ListNode endOfFirstHalf(ListNode head){
ListNode fast = head;
ListNode slow = head;
while(fast.next != null && fast.next.next !=null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
判断链表是否有环
环形链表
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null || head.next == null){
return false;
}
//定义起点位置,相当于同一起跑线,不影响后面的步数之差
ListNode slow = head;
ListNode fast = head.next;
while(slow != fast){
if(fast == null || fast.next == null){
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}
}
删除链表的倒数第 N 个结点
19. 删除链表的倒数第 N 个结点
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0 , head);
ListNode first = head;
ListNode second = dummy;
for(int i = 0; i < n; i++){
first = first.next;//相差n步 计算步差
}
while(first != null){
//移动两个指针
//当first移动到末尾时,此时second移动到倒数第n个点的前驱节点
first = first.next;
second = second.next;
}
//删掉
second.next = second.next.next;
ListNode ans = dummy.next;
return ans;
}
}