-
移除a所指向节点。
-
返回链头。
方法二:别人写的,思路与方法一的相同。
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;
}
}
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);
最后
大厂面试问深度,小厂面试问广度,如果有同学想进大厂深造一定要有一个方向精通的惊艳到面试官,还要平时遇到问题后思考一下问题的本质,找方法解决是一个方面,看到问题本质是另一个方面。还有大家一定要有目标,我在很久之前就想着以后一定要去大厂,然后默默努力,每天看一些大佬们的文章,总是觉得只有再学深入一点才有机会,所以才有恒心一直学下去。