Leetcode--19. 删除链表的倒数第N个节点
給定一個鏈表,刪除鏈表的倒數(shù)第?n?個節(jié)點(diǎn),并且返回鏈表的頭結(jié)點(diǎn)。
示例:
給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當(dāng)刪除了倒數(shù)第二個節(jié)點(diǎn)后,鏈表變?yōu)?1->2->3->5.
說明:
給定的 n?保證是有效的。
進(jìn)階:
你能嘗試使用一趟掃描實(shí)現(xiàn)嗎?
?
快慢指針法
一次遍歷就可以完成,我運(yùn)用了三個指針來完成
剛開始,第一個p,第二個r指針指向第一個節(jié)點(diǎn),第三個指針q指向第n-1個節(jié)點(diǎn)
之后第一個指針,第三個指針向后移動,第二個指針指向第一個指針的前一個節(jié)點(diǎn)(一會方便刪除)
當(dāng)?shù)谌齻€指針q的下一個指向?yàn)榭諘r,說明第一個指針p所指向的節(jié)點(diǎn)就是需要刪除的節(jié)點(diǎn)
那么r.next = r.next.next就可以直接刪除
可以直接提交的代碼:
class Solution {
? ? public ListNode removeNthFromEnd(ListNode head, int n) {
? ? ? ?ListNode p,q,r;
?? ??? ?p = head;
?? ??? ?q = head;
?? ??? ?r = p;
?? ??? ?int i;
?? ??? ?if(head.next==null)?
?? ??? ?{
?? ??? ??? ?head = null;
?? ??? ??? ?return head;
?? ??? ?}
?? ??? ?for(i=1;i<n;i++)
?? ??? ?{
?? ??? ??? ?q = q.next;
?? ??? ?}
?? ??? ?if(q.next==null)
?? ??? ?{
?? ??? ??? ?head = head.next;
?? ??? ?}
?? ??? ?while(q.next!=null)
?? ??? ?{
?? ??? ??? ?r = p;
?? ??? ??? ?p = p.next;
?? ??? ??? ?q = q.next;
?? ??? ?}
? ? ? ? r.next = r.next.next;
? ? ? ? return head;
? ? }
}
?
完整代碼:
package Solution19;
public class Solution19 {
?? ?public static ListNode removeNthFromEnd(ListNode head, int n) {
?? ??? ?ListNode p,q,r;
?? ??? ?p = head;
?? ??? ?q = head;
?? ??? ?r = p;
?? ??? ?int i;
?? ??? ?if(head.next==null)?
?? ??? ?{
?? ??? ??? ?head = null;
?? ??? ??? ?return head;
?? ??? ?}
?? ??? ?for(i=1;i<n;i++)
?? ??? ?{
?? ??? ??? ?q = q.next;
?? ??? ?}
?? ??? ?if(q.next==null)
?? ??? ?{
?? ??? ??? ?head = head.next;
?? ??? ?}
?? ??? ?while(q.next!=null)
?? ??? ?{
?? ??? ??? ?r = p;
?? ??? ??? ?p = p.next;
?? ??? ??? ?q = q.next;
?? ??? ?}
? ? ? ? r.next = r.next.next;
? ? ? ? return head;
? ? }
?? ?public static void main(String[] args)
?? ?{
?? ??? ?ListNode head = new ListNode(1);
?? ??? ?ListNode p = head;
?? ??? ?ListNode q = new ListNode(2);
?? ??? ?p.next = q;
?? ??? ?p = q;
?? ??? ?q = new ListNode(3);
?? ??? ?p.next = q;
?? ??? ?p = q;?
?? ??? ?q = new ListNode(4);
?? ??? ?p.next = q;
?? ??? ?p = q;?
?? ??? ?q = new ListNode(5);
?? ??? ?p.next = q;
?? ??? ?p = q;?
?? ??? ?p.next = null;
?? ??? ?head = removeNthFromEnd(head,2);
?? ??? ?while(head!=null)
?? ??? ?{
?? ??? ??? ?System.out.println(head.val);
?? ??? ??? ?head = head.next;
?? ??? ?}
?? ?}
}
?
總結(jié)
以上是生活随笔為你收集整理的Leetcode--19. 删除链表的倒数第N个节点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js纯ajax,自动完成JS类(纯JS,
- 下一篇: Leetcode--20. 有效的括号