可以使用双指针来解决这个问题。首先,我们使用两个指针front和behind,初始时都指向链表的头节点head。然后,我们将front指针移动k个位置,使得front指针指向第k+1个节点,behind指针指向第1个节点。

接下来,我们同时移动front和behind指针,直到front指针指向链表的最后一个节点。这样,behind指针就会指向倒数第k+1个节点,即要删除的节点的前一个节点。

最后,我们将behind指针的next指针指向要删除的节点的下一个节点,即完成了删除操作。

以下是具体的实现代码:

public ListNodeE remove(ListNodeE head, int k) {
    ListNodeE dummy = new ListNodeE(0);
    dummy.next = head;
    ListNodeE front = dummy, behind = dummy;
    
    // 将front指针移动k个位置
    while (k > 0) {
        front = front.next;
        k--;
    }
    
    // 同时移动front和behind指针
    while (front.next != null) {
        front = front.next;
        behind = behind.next;
    }
    
    // 删除节点
    behind.next = behind.next.next;
    
    return dummy.next;
}

需要注意的是,在实现过程中,我们使用了一个虚拟节点dummy来简化删除操作。最后,返回dummy节点的next指针即可得到已经删除了倒数第k个元素的新链表

public class ListNodeE int val; ListNodeE next; public ListNodeEint x val = x; public ListNodeE removeListNodeE headint k ListNodeE front = head

原文地址: https://www.cveoy.top/t/topic/igyN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录