题目:19. 删除链表的倒数第 N 个结点
思路:前后指针,时间复杂度0(n)。
建一个哨兵节点,避免节点数为1的特殊情况
C++版本:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode new_head(0,head);
ListNode *p=&new_head,*q=&new_head;
while(n--){
q=q->next;
}
while(q->next){
q=q->next;
p=p->next;
}
// p的下一个节点就是要删除的
ListNode * tmp=p->next;
p->next=tmp->next;
delete tmp;
return new_head.next;
}
};
JAVA版本:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode new_head=new ListNode(0,head);
ListNode p=new_head,q=new_head;
while(n>0){
n--;
q=q.next;
}
while(q.next!=null){
q=q.next;
p=p.next;
}
ListNode tmp=p.next;
p.next=tmp.next;
return new_head.next;
}
}
GO版本:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeNthFromEnd(head *ListNode, n int) *ListNode {
new_head:=ListNode{Val:0,Next:head}
p,q:=&new_head,&new_head
for n>0 {
n--
q=q.Next
}
for q.Next!=nil {
q=q.Next
p=p.Next
}
tmp:=p.Next
p.Next=tmp.Next
return new_head.Next
}