标签:
问题描述:
Given a linkedlist, remove the nth node fromthe 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.
问题分析:查找链表倒数第k个节点,以及删除链表节点的知识相结合
代码:
Java解法:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode firstNode = head;//双指针法 ListNode lastNode = head; ListNode result = head;//记录头结点返回 ListNode preNode = null;//由于要执行删除操作,由于是单链表,故要事先记录其前驱 /*寻找链表倒数第k个节点*/ for(int i = 0; i < n; i++) { if(firstNode == null) return null; firstNode = firstNode.next; } while(firstNode != null) { firstNode = firstNode.next; preNode = lastNode; lastNode = lastNode.next; } //删除倒数第n个节点 if(preNode == null)//删除时要注意preNode为null即lastNode为头节点的情况,注意删除头结点,则返回的头结点应该为lsatNode.next { result = head.next; } else { preNode.next = lastNode.next; } return result; } }
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *removeNthFromEnd(ListNode *head, int n) { ListNode* firstNode = head; ListNode* lastNode = head; ListNode* result = head; ListNode* preNode = nullptr; for(int i = 0; i < n; i++) { if(firstNode == nullptr) return nullptr; firstNode = firstNode->next; } while(firstNode != nullptr) { firstNode = firstNode ->next; preNode = lastNode; lastNode = lastNode ->next; } if(preNode == nullptr) { result = head->next; } else { preNode-> next = lastNode-> next; } return result; } };
leetcode-19 Remove Nth Node From End of List
标签:
原文地址:http://blog.csdn.net/woliuyunyicai/article/details/45058669