删除链表的倒数第N个节点

题意:


给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。


算法:


 定义两个指针fast,slow,其中fast指针先走n步,因为题目保证给定的n是有效的,所以如果fast走n步后值为NULL,则删除头结点;

否则两个指针开始一起走,直到fast指向链表最后一个节点,此时slow所指节点为应该删除节点的前一个节点。


代码:


 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* removeNthFromEnd(ListNode* head, int n) {
12         ListNode *fast = head;
13         ListNode *slow = head;
14         ListNode *temp = NULL;
15         while (n--)
16             fast = fast->next;
17         if (fast == NULL)
18         {
19             temp = head->next;
20             delete head;
21             return temp;
22         }
23         while (fast->next != NULL)
24         {
25             fast = fast->next;
26             slow = slow->next;
27         }
28         temp = slow->next;
29         slow->next = temp->next;
30         delete temp;
31         return head;
32     }
33 };

 

posted @ 2020-02-27 17:22  格朗  阅读(260)  评论(0编辑  收藏  举报