这次讲解的题目是LeetCode的T19 删除链表的倒数第N个节点(中等),话不多说,接下来上题目:
链表节点的定义:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
这是一道较简单的题目,只要了解链表的数据结构就能想到解决的办法。
解题思路:设置先遍历链表,得到链表的长度,再对该链表进行修改。如下如所示:
我们可以看到,要对倒数第二个进行删除,那么我们就要对index为sum-n-1的节点的next进行修改,让 节点.next=节点.next.next;
接下来上代码:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//判空操作
if(head==null||head.next==null)
return null;
//定义两个指针,point用来操作链表,gethead用来表示对头结点的引用
ListNode point=head;
ListNode gethead=head;
int sum=0;//用来计算链表长度
//计算长度
while(head!=null){
sum++;
head=head.next;
}
int index=0; //计算当前遍历到第几个
//排除特殊情况,当sum=n的时候!
if(sum-n-1<0){
return gethead.next;
}
//通过point指针对链表进行操作
for(int i=0;i<sum;i++){
if(index==sum-n-1){
//修改next 达到删除的目的
point.next=point.next.next;
break;
}
index++;
point=point.next;
}
return gethead;
}
}
代码如上,有两点需要注意!
一:记得进行判空的操作。
二:当sum和n的值相等,即链表长度和删除倒数第n个,这两个值相等的时候sum-n-1会小于0,故不会进行next的修改操作,需要单独拿出来讨论!
附上以上思路的另一种写法:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int length=0;
int index= 0;
ListNode pointHead=head;
ListNode pointRes=head;
while(head!=null){
length++;
head=head.next;
}
// 排除特殊情况
if(length==1) return null;
if(length==n) return pointHead.next;
while(pointHead.next!=null){
if(index==length-n-1){
pointHead.next=pointHead.next.next;
break;
}
pointHead=pointHead.next;
index++;
}
return pointRes;
}
}
以上就是本次题目的讲解,如果有不对的地方,欢迎大家指出,谢谢!