19.9.24 删除链表的倒数第N个结点 中等 (需改进)


 

题目:

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

 

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

 

说明:

给定的 n 保证是有效的。

 

代码:

 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遍历后就回不来了,必须再新创建一个链表来输出结果。

 

posted @ 2019-09-24 09:41  肥斯大只仔  阅读(139)  评论(0编辑  收藏  举报