[Leetcode]Reverse Linked List-再写单链表反转
2016-11-17 10:12
190 查看
Leetcode碰巧又出现这个问题,看来面试算法这个是很常见的题型,不过很久没写过,这次写来又花了不少时间,
主要耽搁在思想的选择上:
一是想通过遍历时直接将指针反转,这样比较高效,但是需要处理好前后指针及后续的关系;
二是通过构建一个新的链表头,然后遍历时直接将链表元素加入到新链接中,该算法比较简明;
三是使用递归遍历链表至倒数第二位元素,接着依次将next指针反转:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
if (head == NULL || head->next == NULL){
return head;
}
struct ListNode* p = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return p;
}这种方法还是从leetcode中才看到,类似于栈的操作,有一定启发性。
主要耽搁在思想的选择上:
一是想通过遍历时直接将指针反转,这样比较高效,但是需要处理好前后指针及后续的关系;
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseList(struct ListNode* head) { struct ListNode *pre = NULL; struct ListNode *p = head; while(p) { struct ListNode *tmpNext = p->next;//current next node p->next = pre; pre = p; p = tmpNext; } return pre; }
二是通过构建一个新的链表头,然后遍历时直接将链表元素加入到新链接中,该算法比较简明;
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseList(struct ListNode* head) { struct ListNode newListHead = { 0, NULL }; struct ListNode *p = head;//first node while(p) { struct ListNode *tmpnew = newListHead.next; struct ListNode *tmp = p->next; newListHead.next = p; p->next = tmpnew; p = tmp; } return newListHead.next; }
三是使用递归遍历链表至倒数第二位元素,接着依次将next指针反转:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
if (head == NULL || head->next == NULL){
return head;
}
struct ListNode* p = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return p;
}这种方法还是从leetcode中才看到,类似于栈的操作,有一定启发性。
相关文章推荐
- 【LeetCode-面试算法经典-Java实现】【206-Reverse Linked List(反转一个单链表)】
- LeetCode 25 Reverse Nodes in k-Group(在K组链表中反转结点)(Linked List)(*)
- leetCode 92.Reverse Linked List II (反转链表II) 解题思路和方法
- [leetcode] Reverse Linked List II 链表反转
- LeetCode 206 Reverse Linked List(反转链表)(Linked List)(四步将递归改写成迭代)(*)
- LeetCode(Reverse Linked List II) 反转指定位置之间的节点
- (Leetcode)92. Reverse Linked List II ——反转单链表
- leetcode-92. Reverse Linked List II(将单链表部分进行转置)
- [LeetCode-92] Reverse Linked List II(反转指定区间链表)
- [LeetCode]206. Reverse Linked List(反转单链表)
- Leetcode Reverse Linked List 反转单链表
- Leetcode Reverse Linked List II 反转特定区间的链表
- 【LeetCode-面试算法经典-Java实现】【092-Reverse Linked List II(反转单链表II)】
- [Leetcode] Reverse linked list ii 反转链表
- Leetcode Reverse Linked List II 反转部分单向链表
- C实现 LeetCode->Reverse Linked List (双指针大法)(单链表反转)
- LeetCode-Reverse Linked List II(反转链表)
- [LeetCode] Reverse Linked List(递归与非递归反转链表)
- leetcode解题之206 # Reverse Linked List Java版 (使用头插法反转链表)
- 如何反转一个单链表 How to reverse a singly linked list