题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
思路
- 链表的题目,首先想到双指针
- cur指针循环n次,如果为null,则说明,n为链表长度,要删除头节点
- 否则,pre和cur指针一起循环,当cur指针为null时,pre在要删除节点的前一个节点。删除下一个节点即可。
- 越简单的题目,越要考虑边界问题(★★★)
scala
object Solution {
def removeNthFromEnd(head: ListNode, n: Int): ListNode = {
var pre = head
var cur = head
var h = head
for(i <- 0 until n){
pre = pre.next
}
if(pre == null){
h = h.next
return h
}
while(pre.next != null){
pre = pre.next
cur = cur.next
}
cur.next = cur.next.next
return head
}
}
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pre = head;
ListNode cur = head;
for (int i = 0; i < n; i++) {
System.out.println(pre.val);
pre = pre.next;
}
if (pre == null) {
head = head.next;
return head;
}
while (pre.next != null) {
cur = cur.next;
pre = pre.next;
}
cur.next = cur.next.next;
return head;
}
}