题目描述:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
JAVA实现如下:
package czz;
/*
* 日期:2022.02.22
* 作者:城主
* 题目:给定一个链表删除倒数第n个节点并返回头节点
* 思考:由于java和C还是有所区别,少了指针的概念,那么在
* java中使用何种结构来表示C语言中的指针概念?
*
* 清楚了节点之间的连接关系,由于是倒数第n个节点,所以,
* 首先定位到第len-n个位置的节点,直接做删除处理。
*
* 收获:
* 1、java中如何创建链表,在节点类中添加add的方法。
*/
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
//添加结点
public void add(int newdata){
ListNode newNode = new ListNode(newdata); //创建一个结点
if(this.next == null){
this.next = newNode;
}
else{
this.next.add(newdata);
}
}
}
public class DeleteNode_0222 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] str= {1,2,3,4,5};
int n=2;
ListNode head=new ListNode(1,null);
for(int i=1;i<str.length;i++) {
head.add(str[i]);
}
}
public static ListNode removeNthFromEnd(ListNode head, int n) {
/*
* 定义快慢指针,快指针先走N步,如果走到末端说明去除头一个节点
* 此时直接做返回。否则,快指针继续走到末端,然后慢指针走到待删
* 除节点的前一个节点。而后直接做删除处理。
*/
ListNode fast=head;
ListNode slow=head;
while(n--!=0)
{
fast=fast.next;
}
if(fast==null)
{
return head.next;
}
fast=fast.next;
while(fast!=null)
{
fast=fast.next;
slow=slow.next;
}
slow.next=slow.next.next;
return head;
}
}
性能评估如下:
以内存换取时间。