怎样应对IT面试与笔试-(十六)

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面试与笔试-(十六)

推荐阅读更多精彩内容