题目要求:
分析:
碰到这种关于链表的题目,条件反射地就想到先要设置一个哑节点。
条件反射完之后,来看看题目要求我们做什么。
在这里,它要求我们删除掉链表中的某一个节点,这在数据结构中是一件相当简单的事情,只要让node.next = node.next.next就好了,但是,这里还有一个前提条件,那就是要删除该链表的倒数第n个节点。所以我们现在要做的是找到该链表的第n个节点。思路如下:
- 将该链表遍历一遍,求出该链表的总长度,记为len;
- 由于已知n的值,所以我们用len - n来表示新的len值,此时它所指向的就是我们想要删除节点的前一个节点。如:
1 -> 2 -> 3 -> 4-> 5,取n = 2,即我们想要删除链表中值为4的这个节点。
根据第1步,我们可以得到链表总长度len = 5,再根据第2步,我们可以得到len = 5 - 2 = 3.
此时3指向该链表中的第3个节点; - 此时,我们令node指向该节点(想要删除节点的前一个节点),然后令node.next = node.next.next即可。
具体代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode node = head;
int len = 0;
while(node != null) {
len ++;
node = node.next;
}
len -= n;
node = dummy;
while(len > 0) {
len --;
node = node.next;
}
node.next = node.next.next;
return dummy.next;
}
}