1.删除链表的结点

编写一个函数,在给定单链表一个结点(非尾结点)的情况下,删除该结点。假设该链表为1 -> 2 -> 3 -> 4 并且给定你链表中第三个值为3的节点,在调用你的函数后,该链表应变为1 -> 2 -> 4。

分析:
1.待删除的节点不是尾节点
2.可以不借助待删除节点的父节点,可以直接操作待删除的节点

 void deleteNode(ListNode* node) {
      ListNode* next=node->next;
      node->val=next->val;
      node->next=next->next;
      free(next);
}

2.删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 n 个节点并返回头结点。给的 n 始终是有效的。尝试一次遍历实现。

给定一个链表: 1->2->3->4->5, 并且 n = 2.

当删除了倒数第二个节点后链表变成了 1->2->3->5.

分析:
1.n永远有效可以不考虑
2.待删除节点可以是尾巴节点,则需要借助父节点,因为待删除的节点不可以直接为NULL
3.当被删节点为头节点时,需要借助第三方节点(头结点的父节点)

 ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* node=(ListNode*)malloc(sizeof(ListNode));
        node->next=head;
        ListNode* front=node;
        while(--n)head=head->next;
        while(head->next!=NULL){
            front=front->next;
            head=head->next;
        }
        ListNode* tmp=front->next;
        front->next=tmp->next;
        free(tmp);
        return node->next;
}

本文固定链接: http://www.js-code.com/node-js/node-js_36112.html