链表的倒数第K个节点(系列)

· 约 2 分钟阅读 · 次阅读 leetcode

剑指 Offer 22. 链表中倒数第k个节点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

 

示例:

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

返回链表 4->5.


双指针法

让fast和slow均指向dummy,然后先让fast走k步,然后二者一起走,k为NULL时,slow到达目的地。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* getKthFromEnd(ListNode* head, int k) {
        if (k <= 0) {
            return NULL;
        }
        ListNode *dummy = new ListNode(0);
        dummy->next = head;
        ListNode *fast = dummy, *slow = dummy;
        while (k > 0 && fast != NULL) {
            fast = fast->next;
            k--;            
        }
        if (fast == NULL) {
            return NULL;
        }
        while (fast != NULL) {
            fast = fast->next;
            slow = slow->next;
        }
        return slow;

    }
};

19. 删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2:

输入:head = [1], n = 1 输出:[] 示例 3:

输入:head = [1,2], n = 1 输出:[1]  

提示:

链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz


双指针思路

先让一个节点early早点出发,先走N步,然后再让另一个节点normal一起走。 当early节点走到链表结尾的时候,另一个节点normal就是需要被删除的节点。 注意记录normal节点的上一个节点

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        dummy = ListNode()
        dummy.next = head

        early = dummy
        while early and n > 0:
            early = early.next
            n = n - 1

        normal = dummy
        prev = dummy
        while early:
            prev = normal
            normal = normal.next
            early = early.next
        # print(early, normal)
        prev.next = normal.next
        del normal
        return dummy.next

使用栈

计算长度