注:内容来源于我本人的微信公众号:码农历险技
一.删除链表中指定的节点
![072e8a146f4c6e6cbce18e8cfb38719a.png](https://i-blog.csdnimg.cn/blog_migrate/7339d049a4800fbbe868871d7b1f1990.jpeg)
LeeCode题目
这道题是删除指定的节点,一般删除节点node我们需要知道这个node的前一个节点,而这道题我们得不到它的前一个节点。
我们可以分析一下,当删除的是最后一个元素时,直接把最后一个元素置为null,
![7f631b8a53ef8b368ba1c8bae120af5c.png](https://i-blog.csdnimg.cn/blog_migrate/52ab444a168764ad5d08e273536fd701.jpeg)
当删除的不是最后一个节点的时候,我们可以把node节点和node.next指针指向的节点交换值,
![b9593f12d453f6dd7cf701bb2e486fce.png](https://i-blog.csdnimg.cn/blog_migrate/408ab93319c1d6eae1ffbd18d248dbbe.jpeg)
这样子只需要把node的下一个节点删掉就行啦,
![b681af3540573912ce36b7536109915a.png](https://i-blog.csdnimg.cn/blog_migrate/0e18d3b49ba22cb7bc2afb4e3566c1ed.jpeg)
public class DeleteNode { public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public void deleteNode(ListNode node) { if(node==null) return; //处理最后一个节点 if(node.next==null){ node=null; return; } //把node.next的值赋值给node node.val=node.next.val; //再把node.next删掉就可以了 node.next=node.next.next; }}
LeeCode上运行结果:
![f7223fff0563b7a806bca084aed13516.png](https://i-blog.csdnimg.cn/blog_migrate/d425bde8f4f163c3749fc6969a729fec.jpeg)
二.删除链表中倒数第N个节点
![5e0cf4d0f2e5a23d8562e0a6f81d9912.png](https://i-blog.csdnimg.cn/blog_migrate/6fa7c8b728004db6e1883bda3508d04d.jpeg)
LeeCode题目
这道题常规做法可以先遍历一次链表求出链表的长度len,倒数第N个节点就是第(len-N+1)个,但是也有一次遍历就可以解决的算法,说到一次遍历估计很多人跟我想到了双指针。
同样的,加个虚拟指针,同时设置两个指针指向虚拟指针,
![0be1c495abe6a24c86d25af0ae92f9bb.png](https://i-blog.csdnimg.cn/blog_migrate/628a17fa351e49c78426876f793deaaf.jpeg)
这时候想让p2先走n+1步,
![f3fd69c9ae8e491bcd6276956cba5736.png](https://i-blog.csdnimg.cn/blog_migrate/338d4d9399c2a65d7f10b52d85a312de.jpeg)
![f9eed490eb3f2e1b68975d92fe1cd637.png](https://i-blog.csdnimg.cn/blog_migrate/5be847111e25cef07a3654a97a123be3.jpeg)
这时候就好办了,每次让p1,p2同时向右走一步,直到p2为null为止,
![79842e39b78f3a39a33dcc003315cca3.png](https://i-blog.csdnimg.cn/blog_migrate/8cf92a58cf2ab22a4c7a83f27942d0b2.jpeg)
这时候p1后面的节点就是要删除的节点,直接删除这个节点就行了。
public class DeleteNode { public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }public ListNode removeNthFromEnd(ListNode head,int n) {if(head==null) return head; //新建虚拟节点 ListNode xuni=new ListNode(0); xuni.next=head; ListNode p1=xuni; ListNode p2=xuni; for(int i=0;i<=n;i++){ p2=p2.next; } while(p2!=null){ p2=p2.next; p1=p1.next; } //删除节点 p1.next=p1.next.next; return xuni.next; }}
LeeCode上运行结果:
![20b14b65efa301667ad69f026314b890.png](https://i-blog.csdnimg.cn/blog_migrate/8c66dfc5a2cee4c82386024ae3886bcb.jpeg)