LeetCode 19. Remove Nth Node From End of List
题目描述
给定一个链表,删除链表的倒数第 $n$ 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 $n$ 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
思路
快慢指针,快指针先走n步,然后快慢一起走,直到快指针走到最后,要注意的是可能是要删除第一个节点,这个时候可以直接返回head -> next
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){ if(!head || !head -> next) return NULL; struct ListNode * fast = head, *slow = head; for(int i = 0; i < n; i++){ fast = fast -> next; } if(!fast){ return head -> next; } while(fast -> next){ fast = fast -> next; slow = slow -> next; } slow -> next = slow -> next -> next; return head; }
|
类似题目
题目描述
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
思路 + 代码
与上面思路相同,使用快慢指针同步移动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
struct ListNode* getKthFromEnd(struct ListNode* head, int k){ if(!head) return NULL; struct ListNode *fast = head, *slow = head; for(int i = 0; i < k && fast != NULL; i++){ fast = fast->next; } while(fast){ fast = fast->next; slow = slow->next; } return slow; }
|
题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
思路
- 先得到链表
head的长度len –> 用来动态申请数组returnArray
- 遍历链表,把其中的元素赋值给数组
returnArray
- 数组内部进行逆置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
int* reversePrint(struct ListNode* head, int* returnSize){ int len = 0, i=0; struct ListNode *p = head; while(p){ len++; p=p->next; } p = head; int *returnArray = (int *)malloc(len * sizeof(int));
while(p){ returnArray[i++] = p->val; p = p->next; } for(i=0;i<len/2;i++){ int temp = returnArray[i]; returnArray[i] = returnArray[len - i - 1]; returnArray[len - i - 1] = temp; } (*returnSize) = len;
return returnArray; }
|