作者:disappearedgod
时间:2014-4-17
题目
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.
Definition for singly-linked list.
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
解法
思路:
尝试过不加头结点,有一下困难
- 其一,for循环中的不能循环n次,因为这样构造的链表其实是没有头指针的。
- 其二,一个麻烦的事情是要分类讨论删除头结点的问题。
所以思路如下:
- 加上头ListNode(0)的目的是让头结点作为节点一样调用。
- 链表考虑单节点情况,空表情况。
- 一快一慢相距n步顺序调用
注:此代码写成时候还没有想到加头结点的好处,所以有冗余。
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode retlist = new ListNode(0);
retlist.next = head;
ListNode l1 = retlist, l2 = retlist;
if(n==0)
return head;
if(n==1 && head.next == null)
return null;
for(int i =0;i<n;i++)
l2= l2.next;
while(l2.next != null){
l1=l1.next;
l2=l2.next;
}
if(l1.next.next!=null)
l1.next = l1.next.next;
else
l1.next = null;//end-1
return retlist.next;
}
}
精妙解法
思路
- 循环不能写成一句话就用while来易于读
- 用计数法来合并两个循环,用判断语句来判断先走步数
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode p = dummy, q = dummy;
int count = 0;
while(p.next != null){
if(count >= n)
q = q.next;
p = p.next;
count++;
}
if(q.next != null)
q.next = q.next.next;
return dummy.next;
}
}