修改分类
This commit is contained in:
parent
d9687332dc
commit
efb982a11b
144
src/main/java/cn/whaifree/leetCode/LinkedList/LeetCode19.java
Normal file
144
src/main/java/cn/whaifree/leetCode/LinkedList/LeetCode19.java
Normal file
@ -0,0 +1,144 @@
|
||||
package cn.whaifree.leetCode.LinkedList;
|
||||
|
||||
import cn.whaifree.leetCode.model.ListNode;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Deque;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
|
||||
public class LeetCode19 {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
Solution2 solution = new Solution2();
|
||||
ListNode listNode = solution.removeNthFromEnd(ListNode.listNodeFromArray(new int[]{1,2,3,4}), 3);
|
||||
ListNode.printList(listNode);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Definition for singly-linked list.
|
||||
* public class ListNode {
|
||||
* int val;
|
||||
* ListNode next;
|
||||
* ListNode() {}
|
||||
* ListNode(int val) { this.val = val; }
|
||||
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
|
||||
* }
|
||||
*/
|
||||
class Solution {
|
||||
|
||||
|
||||
/**
|
||||
* 链表中结点的数目为 sz
|
||||
* 1 <= sz <= 30
|
||||
* 0 <= Node.val <= 100
|
||||
* 1 <= n <= sz
|
||||
*
|
||||
* 时间复杂度:O(Length)
|
||||
* 空间复杂度:O(1)
|
||||
*
|
||||
* @param head
|
||||
* @param n
|
||||
* @return
|
||||
*/
|
||||
public ListNode removeNthFromEnd(ListNode head, int n) {
|
||||
|
||||
// 空链表
|
||||
if (head == null) {
|
||||
return head;
|
||||
}
|
||||
int length = getLength(head);
|
||||
// 删除头
|
||||
if (n == length) {
|
||||
head = head.next;
|
||||
return head;
|
||||
}
|
||||
|
||||
int find = length - n;
|
||||
ListNode index = head;
|
||||
for (int i = 0; i < find - 1; i++) {
|
||||
index = index.next;
|
||||
}
|
||||
index.next = index.next.next;
|
||||
return head;
|
||||
}
|
||||
|
||||
int getLength(ListNode head) {
|
||||
int length = 0;
|
||||
ListNode index = head;
|
||||
while (index != null) {
|
||||
index = index.next;
|
||||
length++;
|
||||
}
|
||||
return length;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Solution1 {
|
||||
|
||||
|
||||
/**
|
||||
* 栈
|
||||
* 时间复杂度:O(Length)
|
||||
* 空间复杂度:O(Length)
|
||||
*
|
||||
* 修改多使用这个栈会更快
|
||||
* LinkedList比Stack快的原因如下1:
|
||||
* 基于数组实现:Stack基于数组实现,随机访问(查找)效率更高,增删改效率较低。
|
||||
* 基于链表实现:LinkedList基于链表实现,增删改效率更高,随机访问(查找)效率较低。
|
||||
* 对于频繁的插入、删除操作,利用LinkedList实现栈自然比Stack快很多。
|
||||
* @param head
|
||||
* @param n
|
||||
* @return
|
||||
*/
|
||||
public ListNode removeNthFromEnd(ListNode head, int n) {
|
||||
|
||||
ListNode dummy = new ListNode(0, head);
|
||||
Deque<ListNode> stack = new LinkedList<ListNode>();
|
||||
// 双端队列
|
||||
ListNode index = dummy;
|
||||
while (index != null) {
|
||||
stack.push(index);
|
||||
index = index.next;
|
||||
}
|
||||
for (int i = 0; i < n; i++) {
|
||||
stack.pop();
|
||||
}
|
||||
ListNode peek = stack.peek();
|
||||
peek.next = peek.next.next;
|
||||
return dummy.next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Solution2 {
|
||||
|
||||
|
||||
/**
|
||||
* 双指针 快慢节点追逐:
|
||||
* 两个节点的差值为n,快指针走完了,慢指针就是了
|
||||
*
|
||||
* @param head
|
||||
* @param n
|
||||
* @return
|
||||
*/
|
||||
public ListNode removeNthFromEnd(ListNode head, int n) {
|
||||
ListNode dummy = new ListNode(0, head);
|
||||
ListNode fast = dummy;
|
||||
ListNode slow = dummy;
|
||||
for (int i = 0; i <= n; i++) {
|
||||
fast = fast.next;
|
||||
}
|
||||
while (fast!= null) {
|
||||
fast = fast.next;
|
||||
slow = slow.next;
|
||||
}
|
||||
slow.next = slow.next.next;
|
||||
return dummy.next;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user