当前位置:   article > 正文

java实现leetcode第19题 —— 删除链表的倒数第 n 个节点_给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个
  • 题目描述

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

  • 示例

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

当删除了倒数第二个节点后,链表变为 1->2->3->5.
  • 思路与代码

​​​​​​​方法一:

  1. ​​​​​​​思路

​​​​​​​           1.1、先找出整个链表的长度;

           1.2、确定出L-n的长度;

           1.3、将链表拼接为L-n长度;

           1.4、将L-n的next指向L-n的next的next;

代码:

  1. public static MontageLinkedList getMontageLink(MontageLinkedList link, int n) {
  2. MontageLinkedList newLinck = new MontageLinkedList(0);
  3. newLinck.next = link;
  4. MontageLinkedList first = link;
  5. int len = 0;
  6. //求出链表的长度
  7. while(first != null) {
  8. len++;
  9. first = first.next;
  10. }
  11. //确定l-n之后的剩余节点数
  12. len = len - n;
  13. first = newLinck; //这一步也必不可少
  14. //将L-n剩余的节点个数进行拼接,拼接的终点是l-n的位置
  15. while(len > 0) {
  16. len--;
  17. first = first.next;
  18. }
  19. //将L-n的位置的指向改为下下一个指针节点
  20. first.next = first.next.next;
  21. return newLinck.next;
  22. }

方法二:

     思路:

             1.1、确定两个指针;

             1.2、第一个指针从1开始走,走n个节点;

             1.3、当第一个节点走了n个时,第二个节点也开始走,第一个指针与第二个指针差距n个数;

             1.4、当第一个指针走向null时,第二个指针刚好走到第n个位置,此时需要将n位置的next指向n的下下个节点;

             1.5、返回最初的链表;

可以看一看leetcode上面的图片:

代码:

  1. public class MontageLinkedList {
  2. int value;
  3. MontageLinkedList next;
  4. public MontageLinkedList(int val) {
  5. value = val;
  6. }
  7. public static void main(String[] args) {
  8. MontageLinkedList mon1 = new MontageLinkedList(3);
  9. MontageLinkedList mon2 = new MontageLinkedList(4);
  10. MontageLinkedList mon3 = new MontageLinkedList(9);
  11. MontageLinkedList mon4 = new MontageLinkedList(29);
  12. MontageLinkedList mon5 = new MontageLinkedList(20);
  13. mon1.next = mon2;
  14. mon2.next = mon3;
  15. mon3.next = mon4;
  16. mon4.next = mon5;
  17. MontageLinkedList l = getMontageLink(3, mon1);
  18. while(l != null) {
  19. System.out.print(l.value + " ");
  20. l = l.next;
  21. }
  22. }
  23. /**
  24. * @param n
  25. * @param li
  26. * @return
  27. * 思路:
  28. * 1、设置两个指针,第一个先走,走到n+1的位置;
  29. * 2、直到第二个指针开始走,第一个指针与第二个指针之间间隔n个数;
  30. */
  31. public static MontageLinkedList getMontageLink(int n, MontageLinkedList li) {
  32. MontageLinkedList list = new MontageLinkedList(0);
  33. list.next = li;
  34. MontageLinkedList first = list;
  35. MontageLinkedList second = list;
  36. for(int i = 1; i < n + 1; i++) {
  37. first = first.next;
  38. }
  39. while(first != null) {
  40. first = first.next;
  41. second = second.next;
  42. }
  43. second.next = second.next.next;
  44. return list.next;
  45. }
  46. }

结果:

3 4 9 20 

就这样了~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/990799
推荐阅读
相关标签
  

闽ICP备14008679号