题目描述
Given a linked list, remove the nth node from the end of list and return its head.
For example,
Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Try to do this in one pass.
解题思路
思路1:
获取链表长度,移除第len-n个节点;
思路2:
使用双指针,遍历一遍,移除倒数第n个节点;
代码
思路1代码:
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode node = head;
int length = 0;
while(node!=null){
node = node.next;
length++;
}
ListNode removeNode = head;
if(n==length){
node = head.next;
removeNode = null;
return node;
}
node = head;
for(int i = 0;i < length - (n+1);i++){
node = node.next;
}
removeNode = node.next;
node.next = removeNode.next;
removeNode = null;
return head;
}
思路2代码:
public static ListNode removeNthFromEnd(ListNode head, int n) {
// 链表为空、n==0或者不符合要求
if (head == null || n <= 0)
return null;
ListNode beforeKthNode = null;
ListNode pHead = head;
int i = 0;
//得到正数第k个节点
while (pHead != null && i < n) {
pHead = pHead.next;
i++;
}
if (i < n) {
return head;
} else if (i == n && pHead == null) {
// 移除头节点
return head.next;
} else {
// 得到倒数第k+1个节点
beforeKthNode = head;
while (pHead.next != null) {
pHead = pHead.next;
beforeKthNode = beforeKthNode.next;
}
// 删除倒数第k个节点
beforeKthNode.next = beforeKthNode.next.next;
}
return head;
}