19. Remove Nth Node From End of List 删除链表的倒数第N个结点
例如 给出列表: 1->2->3->4->5, and n = 2.
删除倒数第二个结点后变为:1->2->3->5
题目限定n总是有效的,且要求我们尽量用一次遍历解决问题
数据结构:Linked List
算法技巧:Tow Pointers(辅助指针)
//总体思路是设置两个指针A和B,A指向head结点,B先走2步指向2结点。然后AB指针同时向后移动,直到B指针为空,这时A指针指向的是倒数第三个结点2,执行常规删除动作
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(!head->next)
return NULL;
ListNode* pre = head;
ListNode *cur = head;
//B指针先走2步
for(int i = 0; i < n; ++i)
cur = cur->next;
if(!cur)
return head->next;
//AB指针同时向后移动,直到B指针为空
while(cur->next)
{
cur = cur->next;
pre = pre->next;
}
//常规删除结点操作
pre->next = pre->next->next;
return head;
}
};
206. Reverse Linked List 反转单链表
使用到的数据结构:List
使用到的算法技巧:dummy node(虚拟结点)
//引入虚拟结点dummy,让reverse过程更好理解
//反转流程:1->2->3->4->5->NULL
//step1 dummy node(-1)->1->2->3->4->5->NULL cur(1)
//step2 dummy node(-1)->2->1->3->4->5->NULL cur(1)
//step3 dummy node(-1)->3->2->1->4->5->NULL cur(1)
//step4 dummy node(-1)->4->3->2->1->5->NULL cur(1)
//step5 dummy node(-1)->5->4->3->2->1->NULL cur(1)
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head) return head;
ListNode *dummy = new ListNode(-1);
dummy->next = head;
ListNode *cur = head;
while(cur->next)
{
ListNode* tmp = cur->next;
cur->next = tmp->next;
tmp->next = dummy->next;
dummy->next = tmp;
}
return dummy->next;
}
};
怎样应对IT面试与笔试-(一)
怎样应对IT面试与笔试-(二)
怎样应对IT面试与笔试-(三)
怎样应对IT面试与笔试-(四)
怎样应对IT面试与笔试-(五)
怎样应对IT面试与笔试-(五-1)
怎样应对IT面试与笔试-(六)
怎样应对IT面试与笔试-(七)
怎样应对IT面试与笔试-(八)
怎样应对IT面试与笔试-(九)
怎样应对IT面试与笔试-(十)
怎样应对IT面试与笔试-(十一)
怎样应对IT面试与笔试-(十二)
怎样应对IT面试与笔试-(十三)
怎样应对IT面试与笔试-(十四)
怎样应对IT面试与笔试-(十五)
怎样应对IT面试与笔试-(十六)
网友评论