给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 求链表长度,时间复杂度为O(2n)
int length = 0;
ListNode temp = head;
while(temp != null){
temp = temp.next;
length++;
}
// 若删除节点为链表头
if(length == n){
head = head.next;
return head;
}
// 顺序遍历链表,删除节点,时间复杂度O(2n)
int number = 0;
temp = head;
while(true){
if(number+n+1 == length){
temp.next = temp.next.next;
return head;
}
number++;
temp = temp.next;
}
}
}
上面代码用了两次遍历,时间复杂度是O(n)。
在思考能不能一次遍历达到要求?