前言今天继续讲一下链表常见问题——删除链表倒数第n个结点:单链表反转两个有序链表合并删除链表的倒数第n个节点找到链表的中间节点有一个节点。链表中环的检测题目:删除链表底部的第n个节点给你一个链表,删除链表底部的第n个节点,返回链表的头节点。Advanced:你能尝试用onepassscan来实现吗?示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]例3:输入:head=[1,2],n=1输出:[1]解1第一个简单的想到的方法是遍历链表,找到要删除的节点,所以解决两个问题第一:1.获取链表的总长度publicintgetLength(ListNodehead){intn=0;while(head!=null){n++;head=head.next;}returnn;}2。找到节点后,如何删除。其实只要把要删除的节点旁边的点划过去即可。tempNode.next=tempNode.next.next;但是,上面的方法是删除tempNode.next节点。如果我们要删除tempNode本身,那么我们必须将初始节点提前到第一个节点之前。比如我们要删除链表的第一个节点,如果你自己的指针指向第一个节点,那么通过上面的删除方法永远不会删除第一个节点。所以将指针提前到第一个节点之前。所以,综上所述,我们得到以下解决方案:/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodeext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){this.val=val;this.next=next;}*}*/classSolution{publicListNoderemoveNthFromEnd(ListNodehead,intn){intlength=getLength(head);//新建一个指向head的链表节点节点,也就是上面要注意的特殊情况ListNodelastNode=newListNode(0,head);ListNodetempNode=lastNode;for(inti=0;i
