参考文章:http://blog.csdn.net/luckyxiaoqiang/article/details/7393134
Leetcode 中 链表节点定义如下:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
题目:
1. 单链表中节点个数
注意:表头为空
int countListNumber(ListNode *head){
int count = 0;
if(head == NULL) return count;
ListNode *p = head;
while(p != NULL){
count++;
p = p->next;
}
return count;
}
2. Reverse Linked List
这个问题有两个相似的子问题
a. Reverse Linked list from begin to the end
ListNode *reverseLinkedlist(ListNode *head)
{
if(head == NULL || head->next == NULL)
return head;
ListNode *pReverseHead = NULL;
ListNode *pCur = head;
while(pCur != NULL){
ListNode *temp = pCur;
pCur = pCur->next;
temp->next = pReverseHead;
pReverseHead = temp;
}
return pReverseHead;
}
b. Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
[解题思路:]
1. 找到m节点的前一个指针pre(加个safe guard可避免头指针的问题)
2. 从m节点开始往后reverse N个节点(双指针,cur,post)
3. 合并pre链表,cur链表及post链表
ListNode *reverseBetween(ListNode *head, int m, int n) {
ListNode *safeG = new ListNode(-1);
safeG->next = head;
head = safeG;
ListNode *pre = head;
while(m >1){
pre = pre->next;
m--;
}
ListNode *cur = pre->next;
ListNode *post = cur->next;
int dis = n-m;
if(dis >0){
while(dis >0 && post != NULL){
ListNode *temp = post->next;
post->next = cur;
cur = post;
post = temp;
}
ListNode *temp = pre->next;
temp->next = post;
pre->next = cur;
}
head = head->next;
delete safeG;
return head;
}
未完,待续...