1
2
3
4
5
6
7
8
|
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. |
题意:删除倒数第N个节点。尽量一次遍历。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/** * Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head== null || n< 1 ) return head;
ListNode cur=head;
while (cur!= null ){
n--;
cur=cur.next;
}
if (n== 0 )head=head.next;
if (n< 0 ){
cur=head;
while (++n!= 0 ){
cur=cur.next;
}
cur.next=cur.next.next;
}
return head;
}
} |
PS:左老师提供的一种找倒数第K个的思路。先遍历一遍,同时K--,最后判断K的大小。K==0说明要删除的是头结点。K>0,说明K不对。K<0的时候,再从头走一遍,不过此时K++,K=0的时候也就找到了第K-1个。此时直接删除就行。
【方法2】网上的快慢指针法。fast先走K-1步。然后slow和fast同时一步一步走。fast到尾部时slow正好到达倒数第K-1个。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
/* public class ListNode { int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/ public class Solution {
public ListNode FindKthToTail(ListNode head, int k) {
if (head== null || k== 0 ) return null ;
ListNode fast=head;
for ( int i= 0 ;i<k- 1 ;i++){
////防止K无效
if (fast.next!= null ){
fast=fast.next;
} else {
return null ;
}
}
ListNode slow=head;
while (fast.next!= null ){
slow=slow.next;
fast=fast.next;
}
return slow;
}
} |
本文转自 努力的C 51CTO博客,原文链接:http://blog.51cto.com/fulin0532/1905464