描述
给定一个链表,从列表的最后删除倒数第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;
}