题目描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
解题思路
- 这个题要是做出来感觉上还是比较简单的,因为我们可以通过循环计算出链表的长度,之后找到想删除的那个元素,将它删除就好了,所以这个解题思路应该分为两个步骤,第一个步骤就是计算出链表长度,第二个步骤是删除倒数第n个元素,期间有一个容易出问题的地方就是倒数的第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) {
int length = 0;
ListNode* temp = head;
while(temp != NULL){
temp = temp -> next;
length++;
}//首先利用循环计算出链表的长度,注意这里length是从1开始的
if(n == length){
return head -> next;
}//当n == length时实际上就是删除第一个节点,所以我们要返回的头节点实际上就是原来头结点的下一个结点
int m = length - n - 1;//我们利用规律,倒数第n个实际上就是正数的第length - n - 1个
ListNode* pre = head;
ListNode* cur = head -> next;
while(m > 0){
pre = pre -> next;
cur = cur -> next;
m--;
}
pre -> next = cur -> 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) {
if(head == NULL || head -> next == NULL)
return NULL;
ListNode* temp = head;
int length = 0;
while(temp != NULL){
temp = temp -> next;
length++;
}
if(n == length){
head = head -> next;
return head;
}
temp = head;
for(int m = length - n - 1;m > 0;m--)
temp = temp -> next;
temp -> next = temp -> next -> next;
return head;
}
};
题解
- 通过观看题解寻找别的方案,找到了一个比较高端的解法吧,利用双指针