【剑指offer系列】-18-删除链表的节点(关键字:LinkedList集合)

在这里插入图片描述

思路:上图使用的是当前节点直接比对,通过被覆值,然后删除下一个节点的方式达到等效删除本节点,但是真正意义上删除的并不是要找的那个节点,节点的地址还是不同的
这里,换一种思路:找到要删除节点的前一个节点,就不说了。而是,遍历节点,存入LinkedList链表中,通过下标索引,直接删除即可。
package Nine.base.list;

import java.util.LinkedList;
import java.util.List;

/**
 * Author:jinpma
 * Date :2020/12/12
 */
public class DeleteNode
{
    public static List<ListNode> list = new LinkedList<ListNode>();

    /**
     * 删除链表上某个节点
     * @param head
     * @param k
     * @return
     */
    public static boolean delete(ListNode head, Integer k)
    {
        if (head == null) return false;
        ListNode tmp = head;
        while (tmp != null){
            if (tmp.val == k){
                if (tmp.next == null){//要删除的节点是最后一个节点
                    while (head.next != tmp){
                        head = head.next;
                    }
                    head.next = tmp.next;
                    return true;
                }else {//要删除的节点不是最后一个节点
                    tmp.val = tmp.next.val;
                    tmp.next = tmp.next.next;
                    return true;
                }
            }else {
                tmp = tmp.next;
            }
        }
       return false;
    }

    public static void main(String[] args)
    {
        ListNode head = new ListNode(1);
        ListNode node1 = new ListNode(2);
        ListNode node2 = new ListNode(3);
        ListNode node3 = new ListNode(4);
        ListNode node4 = new ListNode(5);
        head.next = node1;
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        System.out.println(delete(head, 5));
        ListNode tmp = head;
        while (tmp != null){
            System.out.println(tmp.val);
            tmp = tmp.next;
        }
    }
}