首页 > 试题广场 >

翻转一个环形的链表,下面给出LinkNode数据结构和需要实

[问答题]
翻转一个环形的链表,下面给出LinkNode数据结构和需要实现的函数。(环形链表没有头指针,即空链表用NULL/null表示)。
// C/C++
struct LinkNode {
     int   value;
     LinkNode * next
};

void reverse(LinkNode * root) {
       //   TODO
}

// Java
public class LinkNode {
       private int value;
       private LinkNode next;
}

public void reverse(LinkNode root) {
       // TODO
}



#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <map>
#include <vector>

using namespace std;

struct LinkNode {
 int value;
 LinkNode* next;
};

void InitList(LinkNode **L) {
 *L = (LinkNode*)malloc(sizeof(LinkNode));//malloc的返回参数是指针类型的,应该用指针类型对其强制转化。
 (*L)->next = *L;
 return;
}

void CreatList(LinkNode* root) {
 LinkNode *p, *s;
 p = root;//尾插法,把p当做尾节点
 int tp = 0;
 scanf("%d", &p->value);
 while (scanf("%d",&tp) != EOF) {
  s = (LinkNode*)malloc(sizeof(LinkNode));
  s->value = tp;
  p->next = s;
  p = s;
 }
 s->next = root;
 return;
}

void ListReverse(LinkNode *root) {
 vector<int> v;
 LinkNode *p = root->next;
 v.push_back(root->value);
 while (p != root) {
  v.push_back(p->value);
  p = p->next;
 }
 for (int i = 0;i < v.size();i++) {
  p->value = v[v.size() - i -1];
  p = p->next;
 }
 return;
}

void ListReverse1(LinkNode **root) {
 LinkNode *root1 = (LinkNode*)malloc(sizeof(LinkNode));
 root1->next = *root;
 
 LinkNode *tp = (*root)->next;
 LinkNode *p = tp->next;//显然*和->具有同样的作用,即*p和->next 是同一种类型的变量。
 (*root)->next = NULL;
 do {
  tp->next = root1->next;
  root1->next = tp;
  tp = p;
  p = p->next;
 } while (tp != *root);
 (*root)->next= root1->next;//显然*root和root1才是同一种类型的。
 *root = root1->next;/*从主函数传参到子函数,无论将形参声明为*,还是** 都无法对指针变量进行改变。
显然,指针运算符->和*的功能很相近,这也是虽然无法对指针变量修改,但却可以对next域进行修改的原因。*/
 return;
}

void ListReverse2(LinkNode *root) {
 root = root->next;
 return;
}

void PrintList(LinkNode *root) {
 LinkNode *p = root;
 do {
  printf("%d ",p->value );
  p = p->next;
 } while (p != root);
 return;
}

void change(int *a) {
 int *c = (int *)malloc(sizeof(int));
 *c = 5;
 a = c;
}


int main()
{
 freopen("Text.txt", "r", stdin);
 LinkNode* root;//不要定义为LinkNode** root,无论怎么传参,或者在主函数中初始化都会在进入InitList时报错
 InitList(&root);
 CreatList(root);
 PrintList(root);
 ListReverse1(&root);
 //ListReverse2(*root);
 PrintList(root);
    return 0;
}

https://blog.csdn.net/wi8ruk48/article/details/84900009

发表于 2018-12-08 22:29:39 回复(0)