int getlenth(ListNode* head){
int i = 0;
while(head){
i++;
head = head->next;
}
return i;
}
-
getlenth(ListNode* head)
:计算链表的长度。- 它接受一个链表的头节点
head
作为参数。 - 使用一个循环遍历链表,直到
head
为NULL
(表示链表的末尾)。 - 在循环中,
i
递增以记录遍历过的节点数。 - 返回
i
,即链表的长度。
- 它接受一个链表的头节点
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(head->next == NULL)
return NULL;
ListNode* p = head,*q;
if(n == getlenth(head))
{
return head->next;
}
for(int i = 0;i < getlenth(head) - n - 1;i++){
p = p->next;
}
q = p->next;
p->next = q->next;
delete q;
return head;
}
-
removeNthFromEnd(ListNode* head, int n)
:从链表的末尾移除第n
个节点。- 它接受链表的头节点
head
和一个整数n
作为参数。 - 如果链表中只有一个节点(即
head->next == NULL
),则直接返回NULL
,因为不能从单个节点的链表中移除任何节点。 - 使用两个指针
p
和q
。p
用于遍历链表,q
用于指向要删除的节点的前一个节点。 - 如果
n
等于链表的长度(即要删除的是链表的第一个节点),则直接返回head->next
,即删除头节点后的链表。 - 使用一个循环遍历链表,直到到达要删除节点的前一个位置。循环的终止条件是
p
指向链表的倒数第n+1
个节点。 - 在循环结束后,
q
指向要删除节点的前一个节点,p
指向要删除的节点。 - 将
p->next
设置为q->next
,即跳过q
后面的节点(即要删除的节点)。 - 使用
delete
释放要删除节点的内存。 - 返回链表的头节点
head
。
- 它接受链表的头节点