理论
链表的存储方式
数组是在内存中连续分布的,但是链表在内存中不是连续分布的,散乱的分布在内存的某些地址上,分配机制取决于操作系统的内存管理。
链表的定义
public class ListNode{
int val;
ListNode next;
public ListNode(){}
public ListNode(int val){
this.val=val;
}
public ListNode(int val,ListNode next){
this.val=val;
this.next=next;
}
}
经典方法
虚拟头结点
链表操作的一大问题是必须找到该节点的前一个节点才方便操作
因为头结点没有前一个节点,因此为了应对头结点需要单独处理的情况,采用虚拟头结点
ListNode newNode=new ListNode();
反转链表
利用双指针,从第一个节点开始反转
两两交换链表节点
两个节点交换之后,移向后两位节点
删除链表的倒数第n个节点
利用双指针,快指针现在走n个节点,然后快慢指针同时走,当快指针到达链表尾部时,慢指针正好走到了倒数第n个节点
链表相交
将长链表先走到两个链表相等的位置,再依次比较