描述
给定一个链表,从列表的最后删除倒数第n个元素
例如:
给定链表:1-> 2-> 3-> 4-> 5,并且n = 2。 删除倒数第二个,链表将变为1-> 2-> 3-> 5。
链表定义:
* Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */
我的方法
public ListNode removeNthFromEnd(ListNode head, int n) { if(n==0) return head; int len=0; ListNode temp = head; //检测出链表长度 while(temp.next != null){ len++; temp = temp.next; } //如果要取出的是链表头,那么直接返回链表下一个引用 if(len-n+1 == 0) return head.next; //特殊情况:当要去掉的是末尾元素时 if(n==1){ //特殊情况中的特殊情况:当链表只有一项,且要取出的是结尾元素,那么就相当于清空链表,返回控制内即可 if(len==0){ return null; } //当链表长度>1时 int i=0; temp = head; while(i<len-1){ i++; temp = temp.next; } temp.next = null; return head; } //一般状况 //找到要跳过的那个元素的前一个元素,让这个元素的指针指向下一个的下一个元素:temp.next.next int i=0; temp = head; while(i < len-n){ temp = temp.next; i++; } temp.next = temp.next.next; return head; }
leetcode讨论区的方法
public ListNode removeNthFromEnd1(ListNode head, int n) { ListNode start = new ListNode(0); ListNode slow = start, fast = start; slow.next = head; //移动快指针,让快指针与慢指针的距离为n,即慢指针落后n+1位此时慢指针的next还是head for(int i=1; i<=n+1; i++) { fast = fast.next; } //同时移动快慢指针,当快指针到达最后时,慢指针指向的正好是要跳过的节点的父节点 while(fast != null) { slow = slow.next; fast = fast.next; } //跳过这个节点 slow.next = slow.next.next; return start.next; }