牛客题霸NC53删除链表的倒数第n个节点Java题解
https://www.nowcoder.com/practice/f95dcdafbde44b22a6d741baf71653f6?tpId=117&&tqId=34974&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
方法:快慢指针
解题思路:利用快慢指针,让快指针former先走n步,然后再让快指针former和慢指针latter一起走,这样当快指针指向链表的末尾为null时,慢指针刚好指向链表的倒数第n个节点。再将第n个节点删除即可。这里利用了一个pre指针保存latter的前驱节点,便于删除操作。
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * } */ public class Solution { /** * * @param head ListNode类 * @param n int整型 * @return ListNode类 */ public ListNode removeNthFromEnd (ListNode head, int n) { if(head == null || n<=0){ return null; } ListNode former = head; ListNode latter = head; ListNode pre = null; //latter的前驱 //former先走n步 for(int i=0;i<n;i++){ if(former == null){ //n大于链表长度时 return null; } former = former.next; } //former和latter一起走 while(former!=null){ former = former.next; pre = latter; latter = latter.next; } //latter就是倒数第n个节点 //删除latter节点 if(pre!=null){ pre.next = latter.next; }else{ //当pre==null时,删除头节点 例如:{1},1 head = head.next; } return head; } }