No.19, Remove Nth Node From End of List
输入为一个链表,需要删除第n个节点,返回删除后的链表。
最直白的方法,先循环一遍记录该链表有多长,计算出应该删除的节点的前一个节点n+1位置,再从头循环,到该节点位置后,改变该节点的next到下一个节点的next上。如果是要去掉第一个节点,直接返回head.next。
public class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode node=head; int len=0; while(node!=null){ len++; node=node.next; } node=head; if(len==n){ head=head.next; return head; } while(len-n>1){ node=node.next; len--; } node.next=node.next.next; return head; } }
当然也可以用双指针,一个头指针,和一个距离头指针为n距离的指针。两个一起向后挪,直到后一个指针的next为null时,前面一个指针所指的位置即为要变更的位置。
public class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode n1=head; ListNode n2=head; for(int i=0;i<n;i++){ n2=n2.next; } if(n2==null){ return head.next; } while(n2.next!=null){ n1=n1.next; n2=n2.next; } n1.next=n1.next.next; return head; } }