删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

一种方法是先计算链表的长度N,然后定位到第(N-n)个节点,删除节点(N-n+1)也即(倒数第n个节点)

代码如下:

    public static ListNode removeNthFromEnd(ListNode head, int n) {

        // 新建一个节点temp
        // temp.next = head可以保存链表的头结点
        // 也方便处理删除的是第一个节点(倒数第N个)
        ListNode temp = new ListNode(0);
        temp.next = head;
        int N = 0;
        // Get the length of the list
        while (head != null) {
            N++;
            head = head.next;
        }
        N = N-n;
        head = temp;
        // Locate the (N-n)th node
        while (N>0) {
            head = head.next;
            N--;
        }
        head.next = head.next.next;
        return temp.next;
    }

第二种方法是,使用两个指针,首先将第一个指针置于第二个的后n+1个节点处。再同时移动两个指针,当第一个指向链表末尾时,第二个指针指向第(N-n)个节点。

以n=2为例,即删除倒数第二个节点

指针2指向开始处,指针1与指针2相隔为(n+1)

同时移动指针1与2,当1指向null时,二指向倒数第(n+1)个节点。

代码如下:

    public static ListNode test(ListNode head, int n) {
        ListNode temp = new ListNode(0);
        temp.next = head;
        ListNode p = temp;
        ListNode q = temp;
        while (n+1>0) {
            q = q.next;
            n--;
        }
        while (q != null) {
            p = p.next;
            q = q.next;
        }
        p.next = p.next.next;
        return temp.next;
    }

猜你喜欢

转载自www.cnblogs.com/deltadeblog/p/8947307.html