每日一题 - day18 - 18. 删除链表中的节点 - Java实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jun8148/article/details/86597264

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);
    }
}

猜你喜欢

转载自blog.csdn.net/jun8148/article/details/86597264
今日推荐