1. 反转链表
问题描述: 实现一个函数,反转一个单链表。
详细解析:
- 初始化三个指针:
prev
(指向前一个节点),curr
(当前节点),next
(下一个节点)。 - 遍历链表,对于每个节点,先保存其下一个节点,然后将其
next
指针指向prev
。 - 移动
prev
和curr
指针:将prev
移动到curr
,将curr
移动到next
。 - 当
curr
为NULL
时,链表遍历完成,prev
即为反转后的链表的新头节点。
答案:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr)};
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head;
while (curr) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
2. 删除链表的倒数第N个节点
问题描述: 给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点。
详细解析:
- 创建一个哑节点(dummy node),它的
next
指针指向链表的头节点。这样可以方便地处理删除头节点的情况。 - 使用两个指针
first
和second
,初始时都指向哑节点。 - 移动
first
指针,使得first
和second
之间相隔n
个节点。 - 同时移动
first
和second
指针,直到first
指向链表末尾。 - 此时
second
的next
指针指向的节点就是要删除的节点,调整second
的next
指针,跳过下一个节点即可。
答案:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* first = dummy;
ListNode* second = dummy;
// 移动first,使得first和second之间相隔n个节点
for (int i = 1; i <= n +