原来链表这么有用
1.链表的初始化
class Node{
public int val;
public Node next;
public Node(int x) {
val = x;
next = null;
}
}
2.获取链表的长度
public static int getLength(Node head) {
int length = 0;
Node node = head;
while (node != null) {
length++;
node = node.next;
}
return length;
}
3.链表的插入
链表的插入有三种方式:
头插法:
新节点: newNode
交换过程:
newNode.next=head
head=newNode
尾插法:
新节点:newNode 尾节点: lastNode
交换过程:
lastNode.next=newNode
newNode.next=null
中间插入:
新节点:newNode 原有的节点node(15),node(7)
交换过程:
newNode.next=node(15).next
node(15).next=newNode
顺序不能错,不然15节点的next就断开了,不是原先的连接了
/**
* 链表插入
*
* @param head 链表头节点
* @param nodeInsert 待插入节点
* @param position 待插入位置,取值从2开始
* @return 插入后得到的链表头节点
*/
public static Node insertNode(Node head, Node nodeInsert, int position) {
//头节点为null
if (head==null){
return nodeInsert;
}
//插入位置越界
int size = getLength(head);
if (position>size+1 || position<1){
return head;
}
if (position==1){
nodeInsert.next=head;
head=nodeInsert;
return head;
}
Node current=head;
int curIndex=2;
while(curIndex<=position){
if (position==curIndex){
nodeInsert.next=current.next;
current.next=nodeInsert;
return head;
}
curIndex++;
current=current.next;
}
return head;
}
4.链表的删除
删除头节点:
表头节点是虚拟节点没有值
交换过程:
head=head.next
删除尾节点:
只需要判断当前节点的下一位cur.next是不是要删除的节点,使当前节点的下一位不可达到即可
交换过程:
if(cur.next.val=40){
cur.next=null;
}
删除中间节点:
删除中间节点也非常简单,就是跳过中间节点即可
交换过程:
cur.next=cur.next.next
/**
* 删除节点
*
* @param head 链表头节点
* @param position 删除节点位置,取值从1开始
* @return 删除后的链表头节点
*/
public static Node deleteNode(Node head, int position) {
//无可删除的节点
if (head==null){
return null;
}
//删除节点越界
int size = getLength(head);
if (position<1 || position>size+1){
return head;
}
//删除头节点
if (position==1){
head=head.next;
return head;
}
//最多只能到最终节点的前一个
Node current=head;
int curIndex=2;
while(curIndex<position-1){
curIndex++;
current=current.next;
}
current.next=current.next.next;
return head;
}