【leetcode刷题日记】Task11-删除链表的倒数第n个节点

题目描述

给定一个链表,删除链表的倒数第 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;
    }
};

【leetcode刷题日记】Task11-删除链表的倒数第n个节点_第1张图片

代码优化

  • 实际上就是在上一个代码中改进了,直接找到我们要删除的链表中的元素,直接把他删掉,让他的上一个结点直接指向她的下一个结点

/**
 * 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;
    }
};

【leetcode刷题日记】Task11-删除链表的倒数第n个节点_第2张图片

题解

  • 通过观看题解寻找别的方案,找到了一个比较高端的解法吧,利用双指针

你可能感兴趣的:(LeetCode)