美文网首页
面试题18:删除链表的节点

面试题18:删除链表的节点

作者: scott_alpha | 来源:发表于2019-10-06 22:57 被阅读0次

题目:在O(1)时间内删除链表节点。给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点,链表节点与函数的定义如下:

class ListNode{
    int value;
    ListNode next;
}
public void deleteNode(ListNode head, ListNode toBeDeleted);

思路:充分利用节点里面next这个参数,如果要删除i,则先把i之后的节点j的值复制给节点i,然后把节点i的next指向j的next,最后删除节点j。注意,这里要考虑到链表只有一个节点和待删除的节点位于链表末的情况。
解决方案:

public class Question18 {
    static class ListNode{
        public ListNode(int value){
            this.value = value;
        }
        int value;
        ListNode next;
    }

    public static void deleteNode(ListNode head, ListNode toBeDeleted){
        if (head == null || toBeDeleted == null) return;
        // 要删除的节点的next节点存在
        if (toBeDeleted.next != null){
            ListNode next = toBeDeleted.next;
            toBeDeleted.value = next.value;
            toBeDeleted.next = next.next;
        }
        // 删除的节点的next节点不存在
        else {
            ListNode node = head;
            while (node.next != toBeDeleted){
                node = node.next;
            }
            node.next = null;
        }
    }
    public static void main(String[] args) {
        ListNode pHead = new ListNode(1);
        ListNode pAhead = new ListNode(3);
        ListNode pBhead = new ListNode(5);
        ListNode pChead = new ListNode(7);
        pHead.next = pAhead;
        pAhead.next = pBhead;
        pBhead.next = pChead;
        deleteNode(pHead, pBhead);
        while (pHead != null) {
            System.out.print(pHead.value + ",");
            pHead = pHead.next;
        }
    }
}

题目:在一个排序的链表中,删除链表中重复的节点。
思路:通过pre、node和needDelete来控制,如果有重复元素,则needDelete设置为true,然后把pre的next设置为node的next的next,并且刷新node为node的next的next。
解决方案:

public class Question18 {
    static class ListNode{
        public ListNode(int value){
            this.value = value;
        }
        int value;
        ListNode next;
    }
    public static void deleteDuplication(ListNode head){
        if (head == null) return;
        ListNode pre = new ListNode(Integer.MIN_VALUE);
        ListNode node = head;
        boolean needDelete = false;
        while (node != null){
            ListNode next = node.next;
            if (next != null && next.value == node.value){
                needDelete = true;
            }

            if (!needDelete){
                pre = node;
                node = node.next;
            }else {
                pre.next = node.next.next;
                node = node.next.next;
                needDelete = false;
            }
        }
    }

    public static void main(String[] args) {
        ListNode pHead = new ListNode(1);
        ListNode pAhead = new ListNode(3);
        ListNode pBhead = new ListNode(5);
        ListNode pChead = new ListNode(5);
        pHead.next = pAhead;
        pAhead.next = pBhead;
        pBhead.next = pChead;
//        deleteNode(pHead, pBhead);
        deleteDuplication(pHead);
        while (pHead != null) {
            System.out.print(pHead.value + ",");
            pHead = pHead.next;
        }
    }
}

相关文章

  • 剑指offer之(链表和栈)

    题目列表链表面试题06. 从尾到头打印链表面试题18. 删除链表的节点面试题22. 链表中倒数第k个节点面试题24...

  • 删除链表中重复的节点

    《剑指offer》面试题18:题目二:删除链表中重复的节点。 题目:在一个排序的链表中,如何删除重复的节点?例如,...

  • LeetCode 链表[L1]

    面试题18. 删除链表的节点 写法一:因为有可能会删掉链表的head节点,为了避免讨论这种情况,引入一个头节点(-...

  • 1.数据结构-链表问题

    链表相关问题 删除节点 链表去重 有环链表 反转链表 链表排序 链表相交 其他问题 面试题 02.03. 删除中间...

  • 在O(1)时间内删除链表节点

    《剑指offer》面试题18:在O(1)时间内删除链表节点 题目:给定单向链表的头指针和一个节点指针,定义一个函数...

  • 剑指offer第二版-18.删除链表的节点

    本系列导航:剑指offer(第二版)java实现导航帖 面试题18:删除链表的节点 题目要求:在o(1)时间内删除...

  • 剑指offer第二版-18.2删除排序链表中重复的节点

    本系列导航:剑指offer(第二版)java实现导航帖 面试题18题目二:删除排序链表中重复的节点 题目要求:比如...

  • 面试题18:删除链表的节点

    题目:在O(1)时间内删除链表节点。给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点,链...

  • 面试题 18:删除链表的节点

    题目一:在O(1)时间内删除链表的节点,给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点...

  • 18-删除链表节点、删除链表重复节点

    1. 删除链表节点 2. 删除链表中的重复节点 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没...

网友评论

      本文标题:面试题18:删除链表的节点

      本文链接:https://www.haomeiwen.com/subject/dhrppctx.html