LeetCode题目:删除链表的倒数第N个节点

题目描述:

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

节点的属性里面只有本身的值和下一个节点两个,可以找出倒数第N个节点到底是哪一个节点,把这个节点(Node1)取出来,把这个节点的下一个节点的属性(Node1.next),附给这个节点的上一节点(Node2)的下一节点(Node2.next)属性(有点拗口),这样就直接让这个节点的上一节点直接指向这个节点的下一节点,跳过了这个节点。
注意:把同一个头节点副给不同的节点,都是指向装着这个链表的容器的,所以修改Node2.next是直接修改head里面的内容的。

代码(Java):

public class doingmyself {
	public static void main(String[] args) {
		ListNode head = new ListNode(1);
		head.next = new ListNode(2);
		head.next.next = new ListNode(3);
		head.next.next.next = new ListNode(4);
		head.next.next.next.next = new ListNode(5);
	
		removeNthFromEnd(head, 2);
	}
	public static ListNode removeNthFromEnd(ListNode head, int n) {
		ListNode Node = head;   //三个链表都是指向一个装这个链表的容器的,所以三个链表的修改都会改变head
		ListNode Node1 = head;
		ListNode Node2 = head;
		int length = 0;
		for(int i=1;;i++) {  //通过循环得到链表的长度
			Node = Node.next;
			if(Node==null) {
				length = i;
				break;
			}
		}
		if(length==n && Node==null) return head.next;
		if(length<n && Node == null) return head;
		for(int i = 1;i<=length-n;i++) { //拿到了指定的那个节点
			Node1 = Node1.next;
		}
		for(int i=1;i<length-n;i++) {  //拿到了指定节点的前一个节点
			Node2 = Node2.next;
		}
		Node2.next = Node1.next;  
		return head;
	}
}
发布了0 篇原创文章 · 获赞 0 · 访问量 81

猜你喜欢

转载自blog.csdn.net/weixin_43556670/article/details/105703767
今日推荐