#leetcode19.删除链表中倒数第k个节点/输出链表中倒数第k个节点
这里是删除链表的倒数第k个节点,类似的问题是剑指offer上的返回链表的倒数第k个节点,其实是一类问题,不过返回链表的倒数第k个节点要稍微简单点,只要能找到就ok,而删除的话要把倒数第n-1和倒数第n-3节点给连接起来,稍微麻烦点,先来看返回倒数第k个节点的做法:
1、双节点法:
public ListNode FindKthToTail(ListNode head,int k){ if(head == null || k == 0) return null; ListNode fast = head; while(k-- >0) { if (fast == null) return null; fast = fast.next; } ListNode slow = head; while(fast != null) { fast = fast.next; slow = slow.next; } return slow; }
因为本人有点菜,所以写这段代码的时候碰到了先写fast = fast.next;后判断还是先判断后写fast = fast.next的问题,考虑了一下将过程手画了一下,如果后判断fast == null的话,当k=0的时候,
会因为满足fast==null 而直接return null了,如果是先判断,它会自然的走下一次循环,而下一次循环因为k不再大于0导致退出循环,因此会得到正确的结果。
再看一下递归的写法:
private int count = 0; private ListNode pHead = null; public ListNode FindKthToTail(ListNode head,int k){ if (head == null || k==0) return null; recListNode(head,k); return pHead; } private void recListNode(ListNode head, int k) { if (head == null) return; recListNode(head.next,k); count++; if(count == k) { pHead = head; } }
这是递归的写法,思路也比较简单,就是用一个全局变量来存储倒数节点的位序,另一个ListNode全局引用,当计数个数达到了想要的倒数个数的时候,就可以将当前的head赋值给引用变量,主函数里面返回就可以了~
如果变一下,要求删除倒数第k个节点的话,应该怎么做呢?
看下代码:
public ListNode removeNthFromEnd(ListNode head, int n) { ListNode fast = head; while(n-- >0) { fast = fast.next; } if( fast ==null) { return head.next; } ListNode slow = head; while(fast.next!= null) { slow = slow.next; fast = fast.next; } slow.next = slow.next.next; return head; }
这里使用的是双节点的方法,我考虑了一下,用递归不太好实现,因为需要返回删除后的链表的首节点,需要先知道链表的长度,然后用count进行计数? 同时递归函数里面的参数是局部变量,对齐进行修改之后,原函数的链表的首节点的后续节点其实并没有发生变化,所以用双节点的方法来实现相对更优雅一些!