19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode rNode=reverseNode(head); if(n==1){ rNode=rNode.next; return reverseNode(rNode); } int index=1; ListNode cur=rNode; while(cur.next!=null){ index++; if(index==n){ cur.next=cur.next.next; }else{ cur=cur.next; } } return reverseNode(rNode); } public ListNode reverseNode(ListNode head){ ListNode pre=null; ListNode cur=head; while(cur!=null){ ListNode next=cur.next; cur.next=pre; pre=cur; cur=next; } return pre; } }
public ListNode removeNthFromEnd(ListNode head, int n) { if(head==null||n<=0){ return head; } ListNode reverseHead=reverse(head); ListNode dumyHead=new ListNode(0); dumyHead.next=reverseHead; ListNode cur=dumyHead; //这里的条件是cur!=null &&cur.next!=null,画图好好理解决一下 while(cur!=null && cur.next!=null){ // System.out.println(cur.next.val); n--; if(n==0){ cur.next=cur.next.next; } cur=cur.next; } return reverse(dumyHead.next); } private ListNode reverse(ListNode head){ if(head==null || head.next==null){ return head; } ListNode pre=null; ListNode cur=head; //反转这里的条件是cur!=null 不是cur.next!=null,画图好好理解决一下 while(cur!=null){ ListNode next=cur.next; cur.next=pre; pre=cur; cur=next; } return pre; }