java实现leetcode第19题 —— 删除链表的倒数第 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;

代码:

	public static MontageLinkedList getMontageLink(MontageLinkedList link, int n) {
		MontageLinkedList newLinck = new MontageLinkedList(0);
		newLinck.next = link;
		MontageLinkedList first = link;
		int len = 0;
		
		//求出链表的长度
		while(first != null) {
			len++;
			first = first.next;
		}
		
		//确定l-n之后的剩余节点数
		len = len - n;
		first = newLinck;  //这一步也必不可少
		//将L-n剩余的节点个数进行拼接,拼接的终点是l-n的位置
		while(len > 0) {
			len--;
			first = first.next;
		}
		
		//将L-n的位置的指向改为下下一个指针节点
		first.next = first.next.next;
		return newLinck.next;
	}

方法二:

     思路:

             1.1、确定两个指针;

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

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

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

             1.5、返回最初的链表;

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

代码:

public class MontageLinkedList {
	
	int value;
	MontageLinkedList next;
	
	public MontageLinkedList(int val) {
		value = val;
	}
	

	public static void main(String[] args) {
		MontageLinkedList mon1 = new MontageLinkedList(3);
		MontageLinkedList mon2 = new MontageLinkedList(4);
		MontageLinkedList mon3 = new MontageLinkedList(9);
		MontageLinkedList mon4 = new MontageLinkedList(29);
		MontageLinkedList mon5 = new MontageLinkedList(20);
		
		mon1.next = mon2;
		mon2.next = mon3;
		mon3.next = mon4;
		mon4.next = mon5;
		
		MontageLinkedList l = getMontageLink(3, mon1);
		while(l != null) {
			System.out.print(l.value + " ");
			l = l.next;
		}

	}
	/**
	 * @param n
	 * @param li
	 * @return
	 * 思路:
	 * 1、设置两个指针,第一个先走,走到n+1的位置;
	 * 2、直到第二个指针开始走,第一个指针与第二个指针之间间隔n个数;
	 */
	public static MontageLinkedList getMontageLink(int n, MontageLinkedList li) {
		MontageLinkedList list = new MontageLinkedList(0);
		list.next = li;
		MontageLinkedList first = list;
		MontageLinkedList second = list;
		
		for(int i = 1; i < n + 1; i++) {
			first = first.next;
		}
		
		while(first != null) {
			first = first.next;
			second = second.next;
		}
		
		second.next = second.next.next;
		return list.next;
	}
}

结果:

3 4 9 20 

就这样了~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值