2018.9.30 LeetCode 刷题日记 第19题

Posted tiansiyuan-program

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018.9.30 LeetCode 刷题日记 第19题相关的知识,希望对你有一定的参考价值。

题型比较经典,在一次遍历情况下完成单链表倒数第n个结点的删除:

设立三个结点:

cur 记录当前结点位置

ans 记录要删除的结点的前一个

h 记录链表的表头位置

假设要删除的是倒数第n个点(保证删除位置有效),则cur走到最后一个结点的时候,ans结点应该走到倒数n+1个结点,以便直接删除倒数第3个结点。

 

则 ans 为 cur 走了n个结点时才出发,保证cur对链表遍历结束时,ans.next 指向要删除的结点

最后返回删除该结点的表头 h

程序AC,但是有一种情况,就是如果长度为n的链表,删除倒数第n个点,原算法总是失败,只能对该情况使用返回h.next,,还未想明白

程序如下:

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
  public ListNode removeNthFromEnd(ListNode head, int n) {
    if(head.next == null){
      return null;
    }
    ListNode cur = new ListNode(0);
    ListNode ans = new ListNode(0);
    cur = head;
    ans.next = head;
    int count = 1;
    while(cur != null){
      if(count > n){
        ans = ans.next;
      }
      cur = cur.next;
      count ++;
    }
    if(ans.next == head) return head.next;  //ans没有动,长度为n 的链表删除倒数第n个结点,使用else内的删除无效
    else{
      ans.next = ans.next.next;
      return head;

    }
  }
}































以上是关于2018.9.30 LeetCode 刷题日记 第19题的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题日记之柱状图中的最大面积

LeetCode刷题日记之设计循环双端队列

LeetCode刷题日记之前K个高频元素

关关的刷题日记80 – Leetcode 7. Reverse Integer

LeetCode刷题日记之盛最多水的容器

关关的刷题日记48Leetcode 58. Length of Last Word