给一个带头节点head的单链表,给定start和end两个位置,将这个区间内置。。。
- 思路:就是链表的逆置;先将区间内的逆置,再处理start和end的位置
- 两种情况:
- start是头结点时,要将链表的头结点head更新为end;
- start不是头结点是正常处理;
(还是自己太菜了。。。。面试的时候先去处理start和endl了,导致后面没有处理好,,凉凉啊~~)
不说了,贴上代码:
void List::Reverse(Node* start, Node* end, Node* Head)
{
if (Head == NULL || start == NULL || end == NULL)
{
cout << "非法逆置" << endl;
return;
}
Node* prev = NULL;
Node* cur = Head;
Node* end_next = end->next;
Node* tmp = NULL;
//先将start和end之间逆置,然后在特殊处理start和end节点,
while (cur != start)//找到start的前一个节点prev
{
prev = cur;
cur = cur->next;
}
while (cur != end)
{
tmp = cur->next;
cur->next = prev;
prev = cur;
cur = tmp;
}
cur->next = prev;
//处理start和end
if (start->next == NULL)//如果start是头结点,就把end边城head
{
head = end;
start->next = end_next;
}
else
{
prev = start->next;
start->next = end_next;
prev->next = end;
}
}
很简答对吧!!
下面是整个链表的实现代码(供大家测试):
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef struct ListNode
{
int value;
ListNode* next;
ListNode(int a)
{
value = a;
next = NULL;
}
}Node;
class List
{
public:
List()
{
head = NULL;
tail = NULL;
}
~List()
{
Node* cur = head;
while (cur)
{
head = cur->next;
delete cur;
cur = NULL;
cur = head;
}
head = NULL;
}
void Push(int data);
Node* Find(int data);
void Reverse(Node* start, Node* end, Node* Head = head);
void Print();
private:
static Node* head;
static Node* tail;
};
Node* List::head = NULL;
Node* List::tail = NULL;
void List:: Push(int data)
{
Node* newnode = new Node(data);
if (head == NULL)
{
head = newnode;
tail = head;
}
else
{
//尾插
tail->next = newnode;
tail = tail->next;
}
}
Node* List::Find(int data)
{
if (head == NULL)
return NULL;
Node* cur = head;
while (cur)
{
if (cur->value == data)
return cur;
else
cur = cur->next;
}
return NULL;
}
void List::Reverse(Node* start, Node* end, Node* Head)
{
if (Head == NULL || start == NULL || end == NULL)
{
cout << "非法逆置" << endl;
return;
}
Node* prev = NULL;
Node* cur = Head;
Node* end_next = end->next;
Node* tmp = NULL;
//先将start和end之间逆置,然后在特殊处理start和end节点,
while (cur != start)//找到start的前一个节点prev
{
prev = cur;
cur = cur->next;
}
while (cur != end)
{
tmp = cur->next;
cur->next = prev;
prev = cur;
cur = tmp;
}
cur->next = prev;
//处理start和end
if (start->next == NULL)//如果start是头结点,就把end边城head
{
head = end;
start->next = end_next;
}
else
{
prev = start->next;
start->next = end_next;
prev->next = end;
}
}
void List::Print()
{
Node*cur = head;
while (cur)
{
cout << cur->value << "->";
cur = cur->next;
}
cout << endl;
}
void test()
{
List l;
l.Push(1);
l.Push(2);
l.Push(3);
l.Push(4);
l.Push(5);
l.Push(6);
l.Print();
l.Reverse(l.Find(1), l.Find(6));
l.Print();
}