查找和删除倒数第n个节点的问题

 1 class ListNode
 2 {
 3     int val;
 4     ListNode next;
 5     ListNode(int x)
 6     {
 7         val = x;
 8     }
 9 }
10 public class NthNodeFromEnd {
11      public ListNode removeNthFromEnd(ListNode head, int n)
12      {
13          ListNode p = head;
14          ListNode q = head;
15          for(int i = 0; i < n ; i++)
16          {
17              p = p.next;
18          }
19          if(p == null)//如果p==null,说明倒数第n个就是第一个节点,即头结点。
20          {
21              head = head.next;
22              return head;
23          }
24          while(p.next != null)
25          {
26              p = p.next;
27              q = q.next;
28          }
29          if(q.next != null)
30          {
31              q.next = q.next.next;
32          }
33
34          return head;
35      }
36      public ListNode removeNthFromEnd2(ListNode head, int n)
37      {
38         //因为要删掉倒数第n个节点,那就必须找到倒数第n+1个节点
39         //如果倒数第n正好是头结点,那么头结点前面没有节点了很麻烦,我们可以设置一个节点作为头结点之前的节点
40         //设置一个头结点,这样就不用单独对原始头结点处理了
41          ListNode dumy = new ListNode(0);
42          dumy.next = head;
43          ListNode p = dumy;
44          ListNode q = dumy;
45          for(int i = 0; i < n; i ++)
46          {
47              p = p.next;
48          }
49          while(p.next!=null)
50          {
51              p = p.next;
52              q = q.next;
53          }
54          q.next = q.next.next;
55          return dumy.next;
56      }
57      //找倒数第n个节点
58      public ListNode findNthFromEnd(ListNode head, int n)
59      {
60          ListNode p = head;
61          ListNode q = head;
62          for(int i = 0; i < n-1; i ++)
63          {
64              p = p.next;
65          }
66          while(p.next!=null)
67          {
68              p = p.next;
69              q = q.next;
70          }
71          return q;
72      }
73
74      public static void main(String[] args)
75      {
76          NthNodeFromEnd rn = new NthNodeFromEnd();
77          ListNode n1 = new ListNode(1);
78          ListNode n = rn.removeNthFromEnd(n1, 1);
79          System.out.println(rn.findNthFromEnd(n1, 1).val);
80          if(n == null)
81          {
82              System.out.println(n);
83          }
84          while(n!= null)
85          {
86              System.out.println(n.val);
87              n = n.next;
88          }
89      }
90 }
时间: 2024-10-26 20:47:10

查找和删除倒数第n个节点的问题的相关文章

leetCode 19.Remove Nth Node From End of List(删除倒数第n个节点) 解题思路和方法

Remove Nth Node From End of List 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

19. 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

链表问题----删除倒数第K个节点

在单链表和双链表中删除倒数第K个节点 分别实现两个函数,一个可以删除单链表中的倒数第K个节点,一个可以删除双链表中的倒数第k 个节点,要求时间复杂度是 O(N),空间复杂度是 O(1). [解析] 基本思路: 让链表从头开始走到尾,每移动一步,就让k值减一,当k 值走到结尾时, 如果k 值大于0,说明链表根本没有倒数第k 个节点 如果等于0,那么头节点就是倒数第k 个节点,此时应该返回 head.next 如果小于0,则重新从头节点开始,每移动一步,k 值增加一,当k 等于0时,移动停止,移动到

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

问题描述 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 问题分析与解决 从问题当中,我们只能得到一个链表和要删除的第K个节点的信息,于是就有以下思路:如果链表为空或者K<0时,直接返回:如若不然,遍历链表的每个节点,每经过一个节点K减1.比如对于1 --> 2 --> 3 --> 4该链表的过程如下: K = 5,所遍历的节点以及K值的变化:1 -- > 2 --> 3 --> 4 4,3,2,1: K = 4,所遍

算法总结之 在单链表和双链表中删除倒数第k个节点

分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 当链表走到头时候 如果k值大于0   说明不用调整  因为链表根本没有倒数第k个节点 此时将原链表直接返回即可 如果k值=0,说明链表倒数第k个节点就是头节点,此时直接返回head.next 也就是原链表的第二个节点 让第二个节点作为链表的头节点,此时直接返回head.next 如果k值<0  重新从

2.2 在单链表和双链表中删除倒数第K个节点

题目:分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点 要求:如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1) My: 删除单链表或双链表中倒数第K个节点,核心代码(单链表和双链表的方法定义参见另一篇文:https://www.cnblogs.com/latup/p/9823179.html): 1 def del_k(L, k): 2 index = L.length - k + 1 3 L.delt(index) 原文地址:htt

【链表】 LEETCODE19 删除倒数第n个节点

//第一种解法,遍历一次数长度,然后把头尾相连,再遍历一次 class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* tem=head; int len=0; while(tem->next){ //这里得到的长度是真实长度-1 tem=tem->next; len++; } if(len==0) return NULL; if(len==1){ if(n==1){ head-&

删除倒数第N个节点

19. Remove Nth Node From End of List 1 class Solution { 2 public: 3 ListNode* removeNthFromEnd(ListNode* head, int n) { 4 ListNode *dimmy=new ListNode(0);//加入头结点使得编程简单 5 dimmy->next=head; 6 ListNode *p=dimmy,*q=dimmy; 7 int i=1; 8 while(q->next&

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