LeetCode - Medium - 19

  1. 移除a所指向节点。

  2. 返回链头。

方法二:别人写的,思路与方法一的相同。

Submission


import com.lun.util.SinglyLinkedList.ListNode;

public class RemoveNthNodeFromEndOfList {

// 方法一:我写的

public ListNode removeNthFromEnd1(ListNode head, int n) {

if (head == null || n <= 0)

return head;

int count = 1;

ListNode fakeHead = new ListNode(-1, head);

ListNode p1 = head, p2 = head.next, prev = fakeHead;

while (p2 != null && count < n) {

p2 = p2.next;

count++;

}

if (n != count)

return fakeHead.next;// count > 链表长度的情况

// 齐步走

while (p2 != null) {

prev = p1;

p1 = p1.next;

p2 = p2.next;

}

// 移除

prev.next = p1.next;

p1.next = null; // help GC

p2 = fakeHead.next;

fakeHead.next = null; // help GC

return p2;

}

// 方法二:别人写的

public ListNode removeNthFromEnd2(ListNode head, int n) {

ListNode start = new ListNode(0);

ListNode slow = start, fast = start;

slow.next = head;

// Move fast in front so that the gap between slow and fast becomes n

for (int i = 1; i <= n + 1; i++) {

fast = fast.next;

}

// Move fast to the end, maintaining the gap

while (fast != null) {

slow = slow.next;

fast = fast.next;

}

// Skip the desired node

slow.next = slow.next.next;

return start.next;

}

}

Test


import static org.junit.Assert.*;

import org.junit.Test;

import com.lun.util.SinglyLinkedList;

import com.lun.util.SinglyLinkedList.ListNode;

public class RemoveNthNodeFromEndOfListTest {

@Test

public void test1() {

RemoveNthNodeFromEndOfList obj = new RemoveNthNodeFromEndOfList();

ListNode original1 = SinglyLinkedList.ints2List(1, 2, 3, 4, 5);

ListNode expected1 = SinglyLinkedList.ints2List(1, 2, 3, 5);

assertTrue(SinglyLinkedList.areTwoListEqual(expected1, obj.removeNthFromEnd1(original1, 2)));

ListNode original2 = new ListNode(1);

assertNull(obj.removeNthFromEnd1(original2, 1));

ListNode original3 = SinglyLinkedList.ints2List(1, 2);

ListNode expected3 = new ListNode(1);

assertTrue(SinglyLinkedList.areTwoListEqual(expected3, obj.removeNthFromEnd1(original3, 1)));

}

@Test

public void test2() {

RemoveNthNodeFromEndOfList obj = new RemoveNthNodeFromEndOfList();

ListNode original1 = SinglyLinkedList.ints2List(1, 2, 3, 4, 5);

ListNode expected1 = SinglyLinkedList.ints2List(1, 2, 3, 5);

最后

大厂面试问深度,小厂面试问广度,如果有同学想进大厂深造一定要有一个方向精通的惊艳到面试官,还要平时遇到问题后思考一下问题的本质,找方法解决是一个方面,看到问题本质是另一个方面。还有大家一定要有目标,我在很久之前就想着以后一定要去大厂,然后默默努力,每天看一些大佬们的文章,总是觉得只有再学深入一点才有机会,所以才有恒心一直学下去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值