在单链表中交换两个节点

时间:2014-06-13 21:49:53

标签: linked-list pascal

如何在pascal的单链表中切换两个节点?

procedure List.switch(var n1,n2 : pNode);
var aux : pNode;
begin
  aux := n1;
  p1:= n2;
  n2 := aux;
end;

(这里pNode是列表中节点的指针。)

节点的定义如下:

pNode = ^Node;
Node = record
    data : data;
    next : pNode;
end;

此代码不起作用。它要么不编译,要么说“不能采用常量表达式的地址”,要么就是不做任何事情。我想这与指针的工作原理有关...

我找到了相关信息here,但我没有读过C.

感谢您的任何建议!

2 个答案:

答案 0 :(得分:2)

我认为这样的事情会起作用:

function SwapNodes(first: pNode): pNode;
begin
  Result := first.next;
  first.next := Result.next;
  Result.next := first;
end;

答案 1 :(得分:1)

这样的事情对你有用。它使用Node类型的局部变量(可能是PNode指向的那个)作为占位符。

procedure List.Switch(NodeA, NodeB: PNode);
var
  Temp: Node;
begin
  Temp.Data := NodeB^.Data;
  Temp.Next := NodeB^.Next;
  NodeB^.Data := NodeA^.Data;
  NodeB^.Next := NodeA^.Next;
  NodeA^.Data := Temp.Data;
  NodeA^.Next := Temp.Next;
end;

这是一个不是对象方法的版本,有一个测试它的控制台应用程序:

program Project1;

uses
  System.SysUtils;

type
  PNode = ^Node;
  Node = record
    Data: Integer;
    Next: PNode;
  end;

procedure Swap(NodeA, NodeB: PNode);
var
  Temp: Node;
begin
  Temp.Data := NodeB^.Data;
  Temp.Next := NodeB^.Next;
  NodeB^.Data := NodeA^.Data;
  NodeB^.Next := NodeA^.Next;
  NodeA^.Data := Temp.Data;
  NodeA^.Next := Temp.Next;
end;

var
  A, B: Node;
  pA, pB: PNode;

begin
  New(pA);
  pA^.Data := 1;
  pA^.Next := nil;
  New(pB);
  pB^.Data := 2;
  pB^.Next := @A;
  WriteLn('Before - pA^.Data: ', pA^.Data, ' pB^.Data: ', pB^.Data);
  Swap(pA, pB);
  WriteLn('After - pA^.Data: ', pA^.Data, ' pB^.Data: ', pB^.Data);    // Outputs 2 and 1
  Readln;
  Dispose(pA);
  Dispose(pB);
end.