<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">参考代码前文:</span>
Node 和链表的定义参见Java单链表操作
【代码使用前提】
给定的节点保证在链表中!!!
【解题思路】
把删除当前节点p视为 将p->next 的值覆盖p,直接删除p-.>next 节点
(代码中size为了统计链表的节点个数,实际编写中可以不留意)
将此处的代码添加到MylinkList的定义类中
public void DeleteNode(Node head, Node deleteNode) {
// TODO Auto-generated method stub
if(head==null||deleteNode==null)
//链表为空或者删除的是一个空节点
return;
if(deleteNode.next!=null){
//删除节点在中间,即删除节点的前后都有内容
deleteNode.value=deleteNode.next.value;
deleteNode.next=deleteNode.next.next;
size--;
}
else if(head==deleteNode){
//删除节点为 首节点
head=tail=null;
size--;
}
else{
//删除节点在 尾节点时候
Node temp=head;
while(temp.next!=deleteNode)
temp=temp.next;
tail=temp;
tail.next=null;
size--;
}
}
为了在测试中方便输入deleNode,一起在Mylinklist 的定义类中填写代码findNodeIndex(head,index)函数
public Node findNodeIndex(Node head, int index) {
// TODO Auto-generated method stub
Node temp=head;
for(int i=0;i<index;i++)
temp=temp.next;
return temp;
}
实验结果
在前文的TestLinklist 代码中添加测试结果
实际代码如下:
index控制deleteNode的位置(index=5,此处删除尾节点)
System.out.println("before deleting node, the original linklist:");
linklist.print(linklist.head);
int index=5;
Node deleteNode=linklist.findNodeIndex(linklist.head, index);
linklist.DeleteNode(linklist.head,deleteNode);
System.out.println("after deleting node, the original linklist:");
linklist.print(linklist.head);
实验结果:
before deleting node, the original linklist:
5 7 12 11 10 15
after deleting node, the original linklist:
5 7 12 11 10