需求

思路
删除倒数第N个元素,删除链表元素,要从头部开始遍历得到该元素, 2-3-4-5-6-7-8 共8个元素,删除倒数第2个元素,即7,得到2-3-4-5-6-8,删除倒数3个元素,即6,得到2-3-4-5-7-8,这个是怎么做的呢,

我们删除7,只需要把前面一个节点的后一个节点指向这个节点的后一个节点,即6的next是8,就删除了7,那我们怎么得到6的位置呢,删除的是倒数第2个数据,链表总长7,6的位置是4,即循环的时候,只需要到<size-n即可,得到6的位置
还有一种情况,如果删除的是头节点,只需要返回头结点的下一个节点即可,
实现
public ListNode removeNthFromEnd(ListNode head, int n) {
int size = getsize(head);
ListNode heads = head;//保存头部
ListNode temp = head;
//判断下标是否越界
if (n > size){
System.out.println("下标越界");
return null;
}
//如果要删除的是头结点
if (size == n){
return head.next;
}
//temp是头的下一个节点,少循环一次即可
for (int i=1; i < size-n; i++){
temp = head.next;
head = temp;
}
//head为要删除节点的前一个节点
head.next = head.next.next;
return heads;
}
public int getsize(ListNode listNode){
int size = 0;
while (listNode != null){
size++;
listNode = listNode.next;
}
return size;
}
测试
public static void main(String[] args){
ListNode listNode1 = new ListNode(1);
ListNode listNode2 = new ListNode(2);
ListNode listNode3 = new ListNode(3);
ListNode listNode4 = new ListNode(4);
ListNode listNode5 = new ListNode(5);
ListNode listNode6 = new ListNode(6);
listNode1.next = listNode2;
listNode2.next = listNode3;
listNode3.next = listNode4;
listNode4.next = listNode5;
listNode5.next = listNode6;
ListNode listNode = new RemoveIndexNode().removeNthFromEnd(listNode1,2);
while (listNode != null){
System.out.println(listNode.val);
listNode = listNode.next;
}
}
效果:

QQ交流群:552113611
网友评论