删除链表中倒数第k个节点

1. 问题描述

  给定一个单链表,删除它的倒数第k个节点。例如给定链表: 1→2→3→4→5,删除它的倒数第二个节点后变为 1→2→3→5。可以假设倒数第k个节点总是存在。


2. 方法与思路

  很容易想到第一种方法,就是先对单链表进行进行一次遍历,求出其长度n。然后再进行第二次遍历,设一个指针,向后移动n?k个位置,然后删除这个节点。

  第二种方法就是使用双指针,只需要对链表进行一遍访问即可。

  I. ListNode *p=*q=head

  II. q指针后移k个位置

  III. while q != end

    p,q同时后移

  IV. 删除p的下一个节点

ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *pre=head,*end=head;

        while(n--) end = end->next;

        while(end && end->next) pre = pre->next,end = end->next;

        if(end == NULL) return head->next;
        else
        {
            ListNode *tmp = pre->next;
            pre->next = tmp->next;
            delete tmp;
        }

        return head;
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-03 04:30:50

删除链表中倒数第k个节点的相关文章

删除单链表中倒数第 k 个节点

思路 1 :两个指针 p1 ,p2 ,p1从头开始遍历,当 p1 到达第 k 个节点时,p2 开始: 当 P1 到达链表的最后一个节点时,p2 所指的节点则为链表中倒数第 k 个节点. public class Node{ public int data; public Node next; public Node(int data){ this.data = data; } public Node removeLastKNode(Node head,int k){ if(head == nul

删除链表中倒数第n个节点

1.给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 注意 链表中的节点个数大于等于n 挑战 O(n)时间复杂度 解题思路:刚开始看到倒数第n个节点,不禁感慨如果是数组就可以直接倒着来了.不过针对链表,一定要想起来最常用的方法---快慢指针.设一个fast和slow指针:快指针先走n步,然后快慢指针一起走,

lintcode 容易题:Remove Nth Node From End of Lis 删除链表中倒数第n个节点

题目: 删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点.  样例 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 注意 链表中的节点个数大于等于n 解题: 要删除倒数第n个节点,我们要找到其前面一个节点,也就是倒数第n+1的节点,找到这个节点就可以进行删除.和上题的思想很类似, 定义两个指针,p和cur,cur指针向前走,走了n

剑指offer-第三章高质量的代码(输出该链表中倒数第K个节点)

题目:输入一个链表,输出这个链表中倒数第K个节点.(代码的鲁棒性) 思路:用两个指针p1和p2,都指向头节点,开始的时候,p2不动,p1移动k-1次,指向第k个节点.此时,如果p1->next!=null,则同时移动P1和p2.直到p1指向最后一个节点.此时,P2指向倒数第k个节点. C++代码: #include<iostream> using namespace std; struct ListNode { int m_nValue; ListNode* m_pNext; }; Li

C++ 算法之 链表中倒数第k个节点

题目:输入一个链表,输出链表中倒数第k个节点,为了符合大多数人的习惯,本题从1开始计数,即链表的尾巴节点是倒数第一个节点. 方法1:先遍历链表得到链表的个数n,倒数第k个节点就是n-k+1再遍历一次链表,找到第n-k+1个节点就是倒数第k个节点:这种方法遍历两次链表: 方法2:先遍历链表把链表压入一个栈,再出栈,第k次出栈就是第k个节点: 方法3:先反转链表,再遍历 方法4:定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1:第二个指针保持不动,从第k步开始,第二个指针也开始遍历,两个指

LintCode Python 简单级题目 174.删除链表中倒数第n个节点

题目描述: 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 注意事项 链表中的节点个数大于等于n 您在真实的面试中是否遇到过这个题? Yes 样例 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 挑战 O(n)时间复杂度 标签 两根指针 链表 题目分析: 创建两个指针,head指向表头.curent指向链表第n个元素: 循环后移n次,直至curent=

经典算法学习——链表中倒数第k个节点

这是剑指Offer中非常经典的一道题,也是在面试笔试中高频出现.题目的详细描述如下:输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,从1开始计数,即链表的尾结点是倒数第一个节点. 本题有一个非常直观的解法,就是对链表扫描两遍,第一遍用来记录链表长度为n,第二次从链表头部走(n-k+1)步后,找到的那个节点就是倒数第k个节点.这种算法的问题就是需要扫描链表两遍,显得不是特别聪明. 其实多想想,这个算法模型和栈的形式非常像,我们只要从头开始扫描链表,把扫描到的每一个节点放入栈中,扫

LeetCode 19. Remove Nth Node From End of List(删除链表中倒数第N个节点)

题意:删除链表中倒数第N个节点. 法一:递归.每次统计当前链表长度,如果等于N,则return head -> next,即删除倒数第N个节点:否则的话,问题转化为子问题“对head->next这个链表删除倒数第N个节点”,将head的next指针指向该子问题的结果,返回head即可.这个方法时间复杂度高,不推荐. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next;

链表中倒数第K个节点

输入一个链表,输出该链表中倒数第k个结点. class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }} public class Solution { public ListNode FindKthToTail(ListNode head,int k) { ListNode pre=null,p=null; //两个指针都指向头结点 p=head; pre=head; //记录k值