给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
解法一:需要两趟扫描
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* p = head;//定义两个头结点的复制,一个用来遍历链表,计算整个链表的长度 ListNode* q = head;//另一个用来删除指定位置处的节点 int i = 0; while(p){//用i来保存链表的长度 p=p->next; ++i; } if(i==n) return head->next;//当要删除头结点时 n = i-n; i=0; while(q){ ++i; if(i==n){ q->next=q->next->next; break; } q=q->next; } return head; } };
解法二:只需要一趟扫描
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode *p, *ans; p = head; ans = head; for (int i = 0; i < n; ++i) { p = p -> next; } if (p == NULL) return head -> next; while (p -> next != NULL) { ans = ans -> next; p = p -> next; } ans -> next = ans -> next -> next; return head; } };