版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Somnus_k/article/details/82590402
代码:
public class RemoveNthNodeFromEndofList19 {
public static void main(String[] args) {
ListNode node1 = new ListNode(1);
// node1.next=null;
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;
node5.next = null;
ListNode head = removeNthFromEnd(node1, 5);
while (head != null) {
System.out.print(head.val + " ");
head = head.next;
}
}
//方法1,正数判断
public static ListNode removeNthFromEnd1(ListNode head, int n) {
int len = 0;
ListNode p = head;
while (p != null) {
len++;
p = p.next;
}
int idx = len - n + 1; // 正数第idx个
if (idx == 1)
return head.next;
p = head;
int count = 1;
while (p != null) {
if (count == idx - 1)
break;
p = p.next;
count++;
}
if (p.next != null)
p.next = p.next.next;
else
p.next = null;
return head;
}
//方法2 固定连个指针距离,让前面的指针指向要删除节点的上一个节点
public static ListNode removeNthFromEnd(ListNode head, int n) {
ListNode p = head;
ListNode q = head;
while (p != null & n > 0) {
p = p.next;
--n;
}
if (p == null)
return head.next;
while (p.next != null) {
p = p.next;
q = q.next;
}
if (q.next != null)
q.next = q.next.next;
else
q.next = null;
return head;
}
}
结果:2 3 4 5