备考国央企-算法笔记-01链表
1、链表
解题三板斧
- 假头:作用主要是避免关于空链表的判断与讨论,还可以用来避免检查前驱结点为空的情况
- 新链表:解决在旧链表中进行原地的交换、插入、删除,把复杂的操作变成在新链表中头部插入或者尾部添加
- 双指针:主要用于寻找链表中的特定结点,双指针的走法可以一次一步可以有快有慢,出发点也可以有前有后
假头
假头,通常也叫做Dummy Head 或者 “哑头”,是在链表前面,加上一个额外的节点
链表的基本操作
- 初始化
- 追加节点
- 头部插入节点
- 查找结点
- 插入指定位置之前
- 删除节点
初始化
//初始化
//初始化dummy
private ListNode dummy = new ListNode();//初始化链表tail指针
private ListNode tail = dummy;//初始化链表长度
private int length = 0;
追加节点
public void addAtTail(int val){/*将值为val的节点追加到链表尾部*///尾部添加一个新节点tail.next = new ListNode(val);//移动tail指针tail = tail.next;//链表长度+1length++;
}
头部插入新节点
//创建新节点
private ListNode p = new ListNode();
//p指向第一个节点,p为第一个节点
p.next = dummy.next;
//dummy指向第一个节点p
dummy.next = p;
length++;
查找结点
private ListNode getPrevNode(int index){
/*返回index节点的前驱节点*/
//初始化front与back,分别一前一后ListNode front = dummy.next;ListNode back = dummy;//在查找的时候front与back总是一起走for(int i = 0;i < index && front != null; i++){back = front;front = front.next;}//把back作为prev并返回return back;
}
public int get(int index){//获取链表中第index个节点的值。如果索引无效则返回-1if(index < 0 || index >=length){return -1;}//因为getPrevNode总是返回有效的节点,所以可以直接取值。return getPrevNode(index).next.val;
}
插入指定位置之前
private void insertNode(int index, ListNode p){if(index > length)return -1;
//index<0则直接插入到头节点位置if(index < 0){p.next = dummy.<