📌  相关文章
📜  将最后一个元素移动到给定链表的前面 | 2套(1)

📅  最后修改于: 2023-12-03 14:53:53.427000             🧑  作者: Mango

将最后一个元素移动到给定链表的前面

在给定链表中,我们需要将最后一个元素移动到链表的前面。这可以用以下两种方法实现:

方法一:遍历整个链表找到最后一个元素,并将其移到链表的前面

此方法需要遍历整个链表以找到最后一个元素,然后将其移到链表的前面。这可以通过以下步骤完成:

  1. 遍历整个链表以找到最后一个元素。
  2. 将最后一个节点指向链表的头部。
  3. 将倒数第二个元素指向null。

这个方法可以使用以下代码实现:

public ListNode moveLastToFront(ListNode head) {
    ListNode current = head;
    ListNode prev = null;
    
    while (current.next != null) {
        prev = current;
        current = current.next;
    }
  
    prev.next = null;
    current.next = head;
    head = current;
    
    return head;
}

该方法使用一个while循环来遍历链表,找到最后一个元素和倒数第二个元素。然后,我们将最后一个元素(即current)移动到链表的前面。最后,我们返回已修改的链表头节点。

方法一的时间复杂度

该方法的时间复杂度为$O(n)$。其中n是链表的长度。因为我们只需要遍历链表一次,所以时间复杂度是线性的。

方法二:使用双指针

另一种方法是在链表上使用双指针来找到倒数第二个元素,然后将最后一个元素移动到链表的前面。我们可以使用两个指针:快指针和慢指针。快指针将跑得快,而慢指针将跑得慢。快指针将比慢指针快n个元素。

在这种情况下,快指针将指向最后一个元素。然后,慢指针将指向倒数第二个元素。我们然后将最后一个元素移到链表的前面。

这个方法可以使用以下代码实现:

public ListNode moveLastToFront(ListNode head) {
    ListNode fast = head;
    ListNode slow = head;
    
    while (fast.next != null) {
        slow = fast;
        fast = fast.next;
    }
  
    slow.next = null;
    fast.next = head;
    head = fast;
    
    return head;
}

该方法使用两个指针——快指针和慢指针——来找到倒数第二个元素和最后一个元素。然后将最后一个元素移到链表的前面。最后,我们返回已修改的链表头节点。

方法二的时间复杂度

该方法的时间复杂度也是$O(n)$。其中n是链表的长度。由于我们只需要遍历链表一次,因此时间复杂度是线性的。另外,由于我们只需要常数级别的额外空间来维护两个指针,因此空间复杂度为O(1)。