链表前置知识
链表:通过指针串联在一起的线性结构,每个节点是数据域和指针域(存放指向下一个节点的指针),最后的节点指针域指向null(空指针)
● 链表的入口节点:链表的头结点即head
● 链表类型:单链表,双链表,循环链表
移除链表元素
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummy=new ListNode();
dummy.next=head;//虚拟头节点
ListNode tem=dummy;
while(tem.next!=null){
if(tem.next.val==val){
tem.next=tem.next.next;
}
else{
tem=tem.next;
}
}
return dummy.next;
}
}
● 时间复杂度: O(n)
● 空间复杂度: O(1)
反转链表
//后中前:pre cur tem
class Solution {
public ListNode reverseList(ListNode head) {
ListNode cur=head,pre=null;
while(cur!=null){
ListNode tem=cur.next;//暂存后继
cur.next=pre;//修改next指针
pre=cur;//暂存pre
cur=tem;//cur访问下一节点
}
return pre;
}
}
● 时间复杂度: O(n)
● 空间复杂度: O(1)
两两交换链表中节点
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy=new ListNode();
dummy.next=head;
ListNode tem=dummy;
while(tem.next!=null&&tem.next.next!=null){
ListNode node1=tem.next;
ListNode node2=tem.next.next;
tem.next=node2;
node1.next=node2.next;
node2.next=node1;
tem=node1;//此时node1与node2已交换所以此处为node1,易错!
}
return dummy.next;
}
}
● 时间复杂度: O(n)
● 空间复杂度: O(1)
删除链表的倒数第N个节点
//f先动n+1步,然后f和s同时动,直到f指向链表末尾
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy=new ListNode();
dummy.next=head;
ListNode s=dummy,f=dummy;
for(int i=0;i<=n;i++){
f=f.next;
}
while(f!=null){
f=f.next;
s=s.next;
}
s.next=s.next.next;
return dummy.next;
}
}
● 时间复杂度: O(n)
● 空间复杂度: O(1)
链表相交
//合并链表相交路程相等
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p1=headA,p2=headB;
while(p1!=p2){
if(p1==null){
p1=headB;
}
else{
p1=p1.next;
}
if(p2==null){
p2=headA;
}
else{
p2=p2.next;
}
}
return p1;
}
}
● 时间复杂度: O(n+m)
● 空间复杂度: O(1)
环形链表
//1.f=2s;f=s+nb 2.f=a;s=a+nb
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode s=head,f=head;
while(true){
if(f==null||f.next==null)return null;
f=f.next.next;
s=s.next;
if(f==s) break;
}
f=head;
while(s!=f){
f=f.next;
s=s.next;
}
return f;
}
}
● 时间复杂度: O(n)
● 空间复杂度: O(1)
设计链表(todo)
● 时间复杂度: 涉及 index 的相关操作为 O(index), 其余为O(1)
● 空间复杂度: O(n)