18. 删除链表中的节点
问题描述
给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。
单向链表的定义如下:
class ListNode{
int m_nValue;
ListNode next;
public ListNode() {
this.next = null;
}
}
分析
在O(1)的时间内,我们要删除一个节点的话,如果我们遍历链表找到这个节点的话,这需要O(n)的时间,所以我们可以另辟蹊径,删除它的下一个节点,把它的下一个节点的内容复制到这个节点内。
这个思想,需要考虑到,我们删除的是否是尾节点,尾节点的话,另做考虑,我们不能用这种方法解决。
n个节点的链表中,删除中间节点(包括头节点,n > 1)
deleteNode.data = deleteNode.next.data;
deleteNode.next = deleteNode.next.next;
deleteNode.next = null;
如果是尾节点的话,删除尾节点的方法
ListNode pNode = listHead;
while(pNode.next != deleteNode){
pNode = pNode.next;
}
pNode.next = null;
如果只有一个节点,要删除这个节点的话,通过函数我们实现起来,可能有点困难
我们可以使用头结点,利用头节点来操作,这个我只是提一下,不附代码
我们可以通过函数返回值来实现
我尝试调用gc来回收这个对象,但是成功不了
代码上的这个部分是实现不了的,可以借鉴下,在C和C++中有指针的说法,我们free指针就可以做到了
代码如下:
import java.awt.*;
/**
* Class day19 ...
*
* @author LiJun
* Created on 2019/1/22
*/
public class day18 {
private static class ListNode{
int m_nValue;
ListNode next;
public ListNode() {
this.next = null;
}
}
private static void deleteNode(ListNode listHead, ListNode pToDeleted){
if(pToDeleted == null || listHead == null){
return;
}
// 先判断要删除的节点是不是尾节点,如果不是就删除节点
if(pToDeleted.next != null){
pToDeleted.m_nValue = pToDeleted.next.m_nValue;
pToDeleted.next = pToDeleted.next.next;
}
// 判断链表中的节点是不是只有一个
else if(listHead == pToDeleted){
// 供参考,实现不了的,这里只是提供思路,C和C++中可行,指针
listHead = pToDeleted = null;
}
// 链表中有多个节点,删除尾节点
else {
ListNode pNode = listHead;
while(pNode.next != pToDeleted){
pNode = pNode.next;
}
pNode.next = null;
}
}
private static void print(ListNode node){
while(node != null){
System.out.print(node.m_nValue + " ");
node = node.next;
}
System.out.println();
}
public static void main(String[] args) {
ListNode node1 = new ListNode();
ListNode node2 = new ListNode();
ListNode node3 = new ListNode();
ListNode node4 = new ListNode();
ListNode node5 = new ListNode();
ListNode node6 = new ListNode();
ListNode node7 = new ListNode();
ListNode node8 = new ListNode();
node1.m_nValue = 1;node1.next = node2;
node2.m_nValue = 2;node2.next = node3;
node3.m_nValue = 3;node3.next = node4;
node4.m_nValue = 4;node4.next = node5;
node5.m_nValue = 5;node5.next = node6;
node6.m_nValue = 6;node6.next = node7;
node7.m_nValue = 7;node7.next = node8;
node8.m_nValue = 8;
print(node1);
// 删除头结点
deleteNode(node1, node1);
print(node1);
// 删除中间节点
deleteNode(node1, node3);
print(node1);
// 删除尾节点
deleteNode(node1,node8);
print(node1);
// 只有一个节点且删除 目前不成立
ListNode node9 = new ListNode();
node9.m_nValue = 9;
deleteNode(node9, node9);
node9 = null;
print(node9);
}
}