链表中穿针引线

时间:2022-07-28
本文章向大家介绍链表中穿针引线,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

通常操作NEXT指针。这个指针指向哪里

206. Reverse Linked List

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?


解题思路一:迭代

首先需要一个next保存下一个节点的位置;

然后需要一个pre保存上一个节点的位置。

pre -- cur -- next

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* pre = NULL;
        ListNode* cur = head;
        while( cur != NULL) {
            ListNode* next = cur->next;
            
            cur->next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
};

解题思路二:递归

首先反转所有节点,然后再反转。 然后我们需要将head设置为反向列表中的最后一个节点。 我们只需将其下一个节点设置在原始列表中(head-> next)指向它,并将其下一个设置为NULL。

ListNode* reverseList(ListNode* head) {
        if (!head || !(head -> next)) {
            return head;
        }
        ListNode* node = reverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return node;
    }

92. Reverse Linked List II

反转从位置 mn 的链表。请使用一趟扫描完成反转。

说明: 1 ≤ mn ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

83. Remove Duplicates from Sorted List