1 前言
最近在学习剑指offer第2版,看到了链表那一节,就尝试着自己实现了一下简单单向链表
2 定义链表
链表中存储着当前节点的值和指向下一个节点的地址,以及一个构造函数。
public class ListNode {
int val;
ListNode next;
public ListNode(int value) {
val=value;
}
}
3 操作链表
3.1 增加节点
这里实现的是向链表的尾部增加一个节点。首先需要通过循环到达尾部,再修改尾部节点的指向。
// 向链表的末尾添加节点
public static void addListNode(ListNode listNode, int x) {
// 遍历到链表的末尾
while (listNode.next != null) {
listNode = listNode.next;
}
// 新建节点并插入
listNode.next = new ListNode(x);
}
3.2 链表的删除
这里实现的是删除第一个找到的指定值的节点。通过循环遍历链表并做出判断。
// 找到第一个含有某值并删除该节点
public static boolean findAndDeleteFirst(ListNode listNode, int x) {
// 删除需要有一个指针指向前一个节点,一个指针指向当前节点
ListNode curNode = listNode;
ListNode preNode;
while (curNode.next != null) {
//移动指针
preNode = curNode;
curNode = curNode.next;
//判断是否是当前指针
if (curNode.val == x) {
//将前节点的next直接指向下一个节点
preNode.next = curNode.next;
return true;
}
}
return false;
}
3.3 链表的展示
这里实现的是遍历一次链表,输出节点的值。
public static void showListNode(ListNode listNode) {
if (listNode.next == null) {
System.out.println("空列表!");
return;
}
while (listNode.next != null) {
listNode = listNode.next;
System.out.print(listNode.val + "--->");
}
System.out.println();
}
4 主方法
public class ListNodeMain {
public static void main(String[] args) {
//新建、显示
ListNode listNode = new ListNode(-1); // 头结点
ListNodeUtil2.addListNode(listNode, 1);
ListNodeUtil2.showListNode(listNode);
//删除、显示
ListNodeUtil2.findAndDeleteFirst(listNode, 1);
ListNodeUtil2.showListNode(listNode);
//插入、显示
ListNodeUtil2.addListNode(listNode, 2);
ListNodeUtil2.showListNode(listNode);
ListNodeUtil2.addListNode(listNode, 3);
ListNodeUtil2.addListNode(listNode, 4);
ListNodeUtil2.addListNode(listNode, 5);
ListNodeUtil2.showListNode(listNode);
System.out.println("删除值为1的节点");
ListNodeUtil2.findAndDeleteFirst(listNode, 1);
ListNodeUtil2.showListNode(listNode);
System.out.println("删除值为2的节点");
ListNodeUtil2.findAndDeleteFirst(listNode, 2);
ListNodeUtil2.showListNode(listNode);
}
}
5 结语
第三点操作链表和第四点主方法的代码是由 @miaoch 写出的,这一版代码可以解决原版代码删除的bug,且由于头结点的存在保证了ListNode的非空,可以直接进行循环,感谢他的点拨。
6 参考链接
1.java 链表 删除第一个节点失败
2.第三章:操作符(这是我第三遍编辑了,因为bug)
3.Java 到底是值传递还是引用传递?