思路1:设置两个指针p1,p2指向表头,p1先走n步。再两个指针同时走。当p1指针指到链表尾部时,P2指针已经在需要删除节点的前一位。一定要注意一些细节。
1 class ListNode { 2 int val; 3 ListNode next; 4 ListNode(int x) { val = x; } 5 } 6 7 8 public ListNode removeNthFromEnd(ListNode head, int n) { 9 if(head==null||n<=0){ 10 return head; 11 } 12 ListNode p1=head; 13 ListNode p2=head; 14 15 while(n!=0){ 16 if(p1.next!=null){ 17 p1=p1.next; 18 }else if(n==1){ 19 return head.next; 20 }else{ 21 return head; 22 } 23 n--; 24 } 25 26 //两个指针同时移动 27 while(p1.next!=null){ 28 p1=p1.next; 29 p2=p2.next; 30 } 31 //此时p2指针已经在倒数第n+1位,开始删除倒数第n位 32 p2.next=p2.next.next; 33 return head;
思路2:指针p1向前走n-1步,两个指针同时走,p1走到尾节点时,p2到达的节点就是需要删除的节点。此时,可以通过复制后一个元素val给前一个元素,再删除后一个元素即可。实现删除该元素。 要注意细节。
1 public ListNode removeNthFromEnd1(ListNode head, int n) { 2 if(head==null||n<=0){ 3 return head; 4 } 5 if(n==1){ 6 //如果删除倒数第一位,则直接删除 7 if(head.next==null){ 8 return null; 9 }else{ 10 ListNode h=head; 11 while(h.next.next!=null){ 12 h=h.next; 13 } 14 h.next=null; 15 return head; 16 } 17 18 } 19 ListNode p1=head; 20 ListNode p2=head; 21 22 while(n!=1){ 23 if(p1.next!=null){ 24 p1=p1.next; 25 }else if(n!=1){ //如果n大于链表长度的情况 26 return head; 27 } 28 n--; 29 } 30 31 //两个指针同时移动 32 while(p1.next!=null){ 33 p1=p1.next; 34 p2=p2.next; 35 } 36 //此时p2指针已经在倒数第n位,开始删除倒数第n位 37 p2.val=p2.next.val; 38 p2.next=p2.next.next; 39 return head; 40 }