题解
方法一:
单链表只能向后遍历,只要知道倒数第k个节点是顺数第几个节点即可。
public ListNode FindKthToTail(ListNode head,int k) { ListNode cur = head; int count = 0; //第一遍遍历统计链表节点个数 while(cur != null){ count++; cur = cur.next; } ListNode temp = null; //倒数第k个节点,顺数第count - k + 1个,可以自己举个例子 for(int i = 1; i <= count - k + 1; i++){ if(head != null){ temp = head; head = head.next; }else{ temp = null; } } return temp; }
方法二:快慢指针
快指针先遍历k个节点,之后快慢指针(慢节点指向的是第一个节点,快指针指向的是第k+1个节点)一起遍历,当快指针跳出的时候,慢指针指向的就是倒数第k个节点。
public ListNode FindKthToTail(ListNode head,int k) { if(head == null || k == 0){ return null; } //统计快指针遍历节点的个数 int count = 0; ListNode fast = head; ListNode slow = null; while(fast != null){ count++; fast = fast.next; if(count >= k){ slow = head; head = head.next; } } return slow; }
方法二比方法一更需注意一些边界条件:k=0和k>链表的总长度。