T19删除链表的倒数第N个节点——Java实现
T19题目描述
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
解题过程
解法一
思路
-
常规方法… 先计算,是正数第size-n个 设置一个变量,标记节点走一步就+1,直到定位到目标节点为止
解法二
思路
-
使用快慢双指针firstNode以及lastNode 开始时,firstNode指针指向head,而lastNode指针需要先指向一个哑节点,定位到目标节点的前驱节点,便于删除节点 哑节点:ListNode dummyNode = new ListNode(0,head);这样哑节点的下一个节点就是头节点了
实现代码
public ListNode removeNthFromEnd(ListNode head, int n) {
//使用快慢指针
//设first指针先走n步,当它刚走n步的时候,last指针就开始跟着first指针一起走
ListNode firstNode = head;
ListNode dummyNode = new ListNode(0,head);
ListNode lastNode = dummyNode;
int count = 0;
//这里会有点绕,关于什么时候lastNode开始移动,官方解答在一个循环里让firstNode先走,很容易懂
while(firstNode.next != null){
firstNode = firstNode.next;
count++;
if(count>=n){
lastNode = lastNode.next;
}
}
//我这里还考虑了是否删除的是原头节点,与官方解答比起来,就很多余
//没有考虑到dummyNode节点的下一个节点就是新的头节点
if (lastNode.next == head){
return head.next;
}
lastNode.next = lastNode.next.next;
return head;
}
官方解答(更加清晰易懂,向他们学习!)
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0, head);
ListNode first = head;
ListNode second = dummy;
for (int i = 0; i < n; ++i) {
first = first.next;
}
while (first != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
//直接返回哑节点的下一个节点了,不管删除的是不是原先的头节点
ListNode ans = dummy.next;
return ans;
}
解题收获
疑惑点
-
如果删除的是头节点怎么办,使用双指针的时候我要怎么定位它,以及怎么删除它,没有想到可以设置一个哑节点 使用while循环让firstNode先走,在判断lastNode什么时候走的时候脑袋有点混乱
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
有关计算机网络子网划分问题的解析
