Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
leetcode刷题19 删除链表的倒数第 N 个结点
前文
本文为leetcode链表操作相关题目,题目序号为19,主要考察对于链表操作的效率相关问题。
题目信息
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
解题思路
根据题目信息,主要的操作内容是给定我们一个链表,我们需要从链表中删除某个元素,而这个元素是根据序号给定,同时是倒序。根据这个题目要求,很容易想到采用链表遍历的方式处理,以此方式得到倒数第n个链表节点,并对其进行删除操作。而本人的解答方案采取了另一种处理,先对链表进行翻转,翻转后的倒数第n个节点即位第n个节点,这种方式能够减少空间的消耗。具体的处理思路为首先对链表进行一次翻转,得到翻转后的链表。对翻转后的链表进行遍历,获取其中的第n个元素并从翻转后的链表中删除。最后再将处理后的链表进行翻转,也就得到了目标的移除倒数第n个元素的链表,当然,操作过程中需要考虑一些特殊情况。
解题代码
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode nextNode = head.next;
head.next = null;
ListNode node = reverseNode(head,nextNode);
if(n == 1){
if(node == null || node.next == null){
return null;
}else if(node.next.next == null){
return node.next;
}else{
ListNode item = node.next.next;
node.next.next = null;
return reverseNode(node.next,item);
}
}
int cnt = 1;
ListNode currentNode = node;
ListNode lastNode = null;
while(true){
if(cnt == n){
lastNode.next = currentNode.next;
break;
}
lastNode = currentNode;
currentNode = currentNode.next;
cnt++;
}
ListNode secondNode = node.next;
node.next = null;
return reverseNode(node,secondNode);
}
public ListNode reverseNode(ListNode head,ListNode nextNode){
if(nextNode == null){
return head;
}else{
ListNode ntNode = nextNode.next;
nextNode.next = head;
return reverseNode(nextNode,ntNode);
}
}
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。