上一节我们谈到了链表的头插、尾插、中间插入的方法,忘记的小伙伴可以复习一下:
[算法通关村] 1.2 链表的插入
接下来,完成链表的删除工作,我们在上一节的学习中,分别在链表的开头、中间和结尾插入了节点,现在我们想使链表恢复原来的样子,即:1 -> 2 -> 3 -> 4 -> 5,这需要我们分别删除位于头部的 72、位于第三位的节点 30、以及作为结尾的节点 9,这部分内容是比较简单的,按照惯例,完整代码放在最下方。
删除中间节点
删除中间节点时,只需要找到它的前驱结点,使前驱结点的 next 指向它的 next 节点即可,此时由于不存在引用关系,会被 JVM 回收。
其关键代码如下:
cur.next = cur.next.next;
删除头部结点
删除头部节点十分简单,直接让 head 指向 head.next 即可,直接给出图和代码:
return head.next;
删除尾部结点
删除尾部节点同样容易,只需要将尾部节点的前一个节点中 next 变量值等于 null 即可,同样直接给出图与代码:
cur.next = cur.next.next;
完整代码
下面给出该部分的完整代码:
class NewNode {
public int val;
public NewNode next;
NewNode(int val) {
this.val = val;
this.next = null;
}
}
public class BasicLinkList {
public static void main(String[] args) throws Exception {
// 先创建一个链表
NewNode linkedList = BasicLink.initLinkedList(new int[]{1, 2, 3, 4, 5});
NewNode newNode;
// 中间插入节点:在第 3 个节点前,插入 val = 30
// 头部插入节点:插入 val = 72
// 尾部插入节点:插入 val = 9
// 中间删除节点:第 4 个节点
System.out.println(BasicLinkList.toString(BasicLinkList.deleteNode(linkedList, 4)));
System.out.println("========");
// 头部删除节点:
linkedList = BasicLinkList.deleteNode(linkedList, 1);
System.out.println(BasicLinkList.toString(linkedList));
System.out.println("========");
// 尾部删除节点:
System.out.println(BasicLinkList.toString(BasicLinkList.deleteNode(linkedList, BasicLinkList.getLength(linkedList))));
}
/**
* 获取链表长度
*
* @param linkedList 链表头节点
* @return 链表长度
*/
public static int getLength(NewNode linkedList) throws Exception {
int length = 0;
NewNode current = linkedList;
while (current != null) {
length++;
current = current.next;
}
if (length == 0) {
throw new Exception("链表不存在");
}
return length;
}
/**
* 删除节点
*
* @param head 链表头节点
* @param position 删除节点位置,取值从1开始
* @return 删除后的链表头节点
*/
public static NewNode deleteNode(NewNode head, int position) throws Exception {
if (position < 1 || position > getLength(head)) {
throw new Exception("参数:拟删除位置 越界");
}
if (position == 1) {
//curNode就是链表的新head
return head.next;
}
NewNode cur = head;
int count = 1;
// 找到拟删除节点的前一个节点
while (count < position - 1) {
cur = cur.next;
count++;
}
cur.next = cur.next.next;
return head;
}
/**
* 输出链表
*
* @param head 头节点
*/
public static String toString(NewNode head) {
NewNode current = head;
StringBuilder stringBuilder = new StringBuilder();
while (current != null) {
stringBuilder.append(current.val).append("\t");
current = current.next;
}
return stringBuilder.toString();
}
}