1 问题
尝试实现链表的删除,删除找到的第一个节点,但是如果要删除的节点是第一个节点就没有结果,删除其它位置的节点就可以。在方法内部可以看到已经修改了指向,但返回以后没有修改。
下图是在findAndDeleteFirst准备返回时listNode的值
下图是findAndDeleteFirst返回后listNode的值
# 2 运行结果
# 3 用到的代码
3.1 ListNode.java
public class ListNode {
int val;
ListNode next;
public ListNode(int value) {
val=value;
}
}
3.2 ListNodeUtil.java
public class ListNodeUtil {
// 向链表的末尾添加节点
public static void addListNode(ListNode listNode, int x) {
// 是否为空链表
if (listNode == null) {
// 空链表
listNode = new ListNode(x);
return;
}
// 非空 遍历到链表的末尾
while (listNode.next != null) {
listNode = listNode.next;
}
// 新建节点并插入
ListNode newNode = new ListNode(x);
listNode.next = newNode;
return;
}
// 找到第一个含有某值并删除该节点
public static boolean findAndDeleteFirst(ListNode listNode, int x) {
// 链表是否为空
if (listNode == null)
return false;
// 删除的节点在第一个
if (listNode.val == x) {
// 将链表头指向下一个节点
listNode = listNode.next;
return true;
}
// 删除需要有一个指针指向前一个节点,一个指针指向当前节点
ListNode curNode = listNode;
ListNode preNode = null;
while (curNode.next != null) {
//移动指针
preNode=curNode;
curNode=curNode.next;
//判断是否是当前指针
if(curNode.val==x) {
//将前节点的next直接指向下一个节点
preNode.next=curNode.next;
return true;
}
}
return false;
}
public static void showListNode(ListNode listNode) {
if(listNode==null) {
System.out.println("链表为空");
}else {
System.out.print(listNode.val+"--->");
while(listNode.next!=null) {
listNode=listNode.next;
System.out.print(listNode.val+"--->");
}
System.out.println(" ");
}
}
}
3.3 ListNodeMain.java
public class ListNodeMain {
public static void main(String[] args) {
//新建、显示
ListNode listNode=new ListNode(1);
ListNodeUtil.showListNode(listNode);
//删除、显示
ListNodeUtil.findAndDeleteFirst(listNode, 1);
ListNodeUtil.showListNode(listNode);
//插入、显示
ListNodeUtil.addListNode(listNode, 2);
ListNodeUtil.showListNode(listNode);
ListNodeUtil.addListNode(listNode, 3);
ListNodeUtil.addListNode(listNode, 4);
ListNodeUtil.addListNode(listNode, 5);
ListNodeUtil.showListNode(listNode);
System.out.println("删除第一个");
ListNodeUtil.findAndDeleteFirst(listNode, 1);
ListNodeUtil.showListNode(listNode);
System.out.println("删除第二个");
ListNodeUtil.findAndDeleteFirst(listNode, 2);
ListNodeUtil.showListNode(listNode);
}
}