【leetcode刷题】T99-删除链表的倒数第N个节点

时间:2022-06-26
本文章向大家介绍【leetcode刷题】T99-删除链表的倒数第N个节点,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

【题目】

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

示例:
给定一个链表: ->->->->, 和 n = 2.
当删除了倒数第二个节点后,链表变为 ->->->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

【思路】

使用两个指针node1和node2,两者相距n个节点。这样,当node2为链表尾部时,删除node1->next即可。注意链表长度等于n这种特殊情况!!

【代码】

python版本

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        l1 = head
        l2 = head
        # 相距n个节点
        for i in range(n):
            l2 = l2.next

        p = head
        if l2 == None:
            head = head.next
            del p
            return head

        # 同时后移
        while(l2.next != None):
            l1 = l1.next
            l2 = l2.next

        p = l1.next
        l1.next = l1.next.next
        del p
        return head

C++版本

/**
 * 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* node1 = head;
        ListNode* node2 = head;
        // node1和node2相差n个元素
        for(int i=; i<n; i++){
            // 题目确保n有效,不用判断链表长度不够n
            cout << node2->val << endl;
            node2 = node2->next;
        }

        // node2已经到链表尾
        ListNode* p = node1;
        if(node2 == NULL){
            head = head->next;
            delete p;
            return head;
        }

        // 同时移动,找到倒数第n个
        while(node2->next != NULL){
            node1 = node1->next;
            node2 = node2->next;
        }

        p = node1->next;
        node1->next = node1->next->next;
        delete p;
        return head;
    }
};