求:node
給定一個鏈表,刪除鏈表的倒數第 n 個節點,而且返回鏈表的頭結點。spa
示例:rem
給定一個鏈表: 1->2->3->4->5, 和 n = 2.List
當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.
說明:進階
給定的 n 保證是有效的。鏈表
進階:next
你能嘗試使用一趟掃描實現嗎?di
解:while
struct
ListNode* removeNthFromEnd(
struct
ListNode* head,
int
n){
int
nodeCount =
0
;
int
i;
struct
ListNode* p = head;
struct
ListNode* tmp;
while
(p!=NULL){
nodeCount++;
p=p->next;
}
p=head;
if
(n==nodeCount){
tmp = head;
head = head->next;
free(tmp);
}
else
{
for
(i=
0
;i<nodeCount-n-
1
;i++){
p=p->next;
}
tmp = p->next;
p->next=tmp->next;
free(tmp);
}
return
head;
}
解:
struct
ListNode* removeNthFromEnd(
struct
ListNode* head,
int
n){
struct
ListNode* p1=(
struct
ListNode*)malloc(
sizeof
(
struct
ListNode));
struct
ListNode* p2=(
struct
ListNode*)malloc(
sizeof
(
struct
ListNode));
struct
ListNode* result = p1;
p1->next = head;
p2->next = head;
int
i;
for
(i=
0
;i<n;i++){
p2=p2->next;
}
while
(p2->next!=NULL){
p2=p2->next;
p1=p1->next;
}
struct
ListNode* tmp = p1->next;
p1->next=tmp->next;
free(tmp);
return
result->next;
}