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

1、给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。

给出链表1->2->3->4->5->null和 n = 2.

删除倒数第二个节点之后,这个链表将变成1->2->3->5->null.

注意

链表中的节点个数大于等于n

挑战

O(n)时间复杂度

解题思路:刚开始看到倒数第n个节点,不禁感慨如果是数组就可以直接倒着来了。不过针对链表,一定要想起来最常用的方法---快慢指针。设一个fast和slow指针;快指针先走n步,然后快慢指针一起走,当fast==null,慢指针就值的是倒数第n个,然后删除就行。

 1 /**
 2  * Definition for ListNode.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int val) {
 7  *         this.val = val;
 8  *         this.next = null;
 9  *     }
10  * }
11  */
12 public class Solution {
13     /**
14      * @param head: The first node of linked list.
15      * @param n: An integer.
16      * @return: The head of linked list.
17      */
18     ListNode removeNthFromEnd(ListNode head, int n) {
19         // write your code here
20         ListNode fast=head;
21         ListNode result = new ListNode(0);
22         result.next = head;
23         for(int i=0;i<n-1;i++){
24             fast = fast.next;
25         }
26         ListNode now = result;
27         while(fast.next != null){
28             fast = fast.next;
29             now = now.next;
30         }
31         now.next = now.next.next;
32         return result.next;
33     }
34 }
时间: 2024-08-26 09:05:32

删除链表中倒数第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

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=

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个节点

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 != e

[LeetCode]78. Remove Nth Node From end of List删除链表中倒数第N个节点

Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5. Note:Given n

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

1 /** 2 * Definition of ListNode 3 * class ListNode { 4 * public: 5 * int val; 6 * ListNode *next; 7 * ListNode(int val) { 8 * this->val = val; 9 * this->next = NULL; 10 * } 11 * } 12 */ 13 class Solution { 14 public: 15 /** 16 * @param head: The fi

删除单链表中倒数第 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

LeetCode(19):删除链表的倒数第N个节点

Medium! 题目描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的. 进阶: 你能尝试使用一趟扫描实现吗? 解题思路: 这道题让我们移除链表倒数第N个节点,限定n一定是有效的,即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