LeetCode.M19
题目:
题目大意:
给定一个链表和一个数n,删除倒数第n个数。
数据范围:
如图所示
思路:
采用双指针。思路和找到数组中倒数第n个数一致,只不过这里需要找到链表的倒数第n+1个元素,这样的话,才可以把倒数第n个数删掉。注意也有可能要求删除第一个结点(倒数最后一个节点),这里我们为了保持操作的一致性,在第一个节点的前面新增加一个头结点headNode。
然后进行双指针操作,初始时pi = pj = headNode, k = 1。
-
在k < n + 1时,只有pi在移动。
-
在 k >= n + 1时,pi和pj一起移动。
-
在pi.next == null 的时候,pj所处的位置正是倒数第n + 1个节点x的位置,
现在将倒数第n个节点删除(x.next = x.next.next)。
注意返回时,返回headNode.next,因为我们在第一个节点前增加了一个头结点。
代码:
import java.util.List;
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 {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode headNode = new ListNode();
headNode.next = head;
ListNode pi = headNode, pj = headNode;
int k = 1;
while (pi.next != null){
if (k >= n + 1){
pj = pj.next;
}
pi = pi.next;
k ++ ;
}
pj.next = pj.next.next;
return headNode.next;
}
}
public class Main {
public static void main(String[] args) {
Solution solution = new Solution();
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(5);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
ListNode head = solution.removeNthFromEnd(node1, 1);
while (head != null){
System.out.print(head.val + ", ");
head = head.next;
}
System.out.println();
}
}
时空复杂度分析等:
-
时间复杂度 : O(n)
-
空间复杂度 : O(1)