题目描述
方法一:双指针,遍历一次
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode();
dummy.next = head;
ListNode slow = head, fast = head, pre = dummy;
//fast先走n个距离
for (int i = 0; i < n; i++) {
fast = fast.next;
}
//三个指针都往后移动
while (fast != null) {
fast = fast.next;
slow = slow.next;
pre = pre.next;
}
//此时fast=null,fast和slow直接间隔为n-1,删除slow即可
pre.next = slow.next;
slow.next = null;
return dummy.next;
}
}
方法二:遍历两次,第一次求总长度,第二次定位到要删除的节点
class Solution {
public ListNode deleteNode(ListNode head, int val) {
ListNode dummy = new ListNode(0);//为了能删第一个元素,或者特殊处理第一个节点也行
dummy.next = head;
ListNode cur = dummy;
while (cur != null) {
if (cur.next.val == val) {
cur.next = cur.next.next;
break;
} else {
cur = cur.next;
}
}
return dummy.next;
}
}
当处理删除头节点时,有两种方法
-
使用dummynode,dummy.next = dummy.next.next
-
特判,直接返回head.next