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题的主要内容,如果未能解决你的问题,请参考以下文章