📅  最后修改于: 2023-12-03 14:53:53.427000             🧑  作者: Mango
在给定链表中,我们需要将最后一个元素移动到链表的前面。这可以用以下两种方法实现:
此方法需要遍历整个链表以找到最后一个元素,然后将其移到链表的前面。这可以通过以下步骤完成:
这个方法可以使用以下代码实现:
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)。