题目:
代码:
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 class Solution { 10 public ListNode removeNthFromEnd(ListNode head, int n) { 11 ListNode curr1 = new ListNode(0); 12 ListNode curr2 = new ListNode(0); 13 ListNode p = new ListNode(0); 14 curr1 = p = curr2 = head; 15 int num = 0; 16 17 while(curr1 != null){ 18 num++; 19 curr1 = curr1.next; 20 } 21 if(num == n){ 22 head = head.next; 23 return head; 24 } 25 26 else{ 27 for(int i = 0; i < num - n; i++){ 28 if(curr2 != null){ 29 curr2 = curr2.next; 30 } 31 if(i == num - n - 2){ 32 p = curr2; 33 } 34 } 35 } 36 p.next = curr2.next; 37 ListNode result = new ListNode(0); 38 result.next = head; 39 return result.next; 40 } 41 }
心得:
1、这道题的思路还是比较简单的,倒序,那就用两趟遍历,第一趟算出链表长度,第二趟标明要删除的数据元素,最后进行删除输出结果;
2、题目说明要返回头结点,那么就是要新建一个有头结点的链表来返回了;
3、这次做题目的时候回忆起了对象的复制是直接引用的
1 curr1 = p = curr2 = head;
像这一句话,修改curr1、p和curr2都会直接修改head;
4、也发现了上面几个对象用next遍历后就回不来了,必须再新创建一个链表来输出结果。