【发布时间】:2014-08-06 18:05:33
【问题描述】:
在 Pascal 中,当我有一个带有这样定义的节点的单链表时,
pNode = ^Node;
Node = record
data : data;
next : pNode;
end;
当我像这样遍历列表时
while y<>z do begin
if y^.data < x^.data then begin
{ HERE I WOULD LIKE TO MOVE y IN FRONT OF X }
end;
y:=y^.next;
end;
其中 x 是枢轴(列表的开头),y 是“索引”,z 是列表的尾部(结尾)(是的,我正在尝试对单链表执行快速排序)。我将如何完成评论中的任务?
我做了程序insertAfter:
procedure List.insertAfter(n : pNode; var what : data);
var newn : pNode;
begin
new(newn);
newn^.data := what;
newn^.next := n^.next;
n^.next := newn;
end;
和insertInstead
procedure List.insertInstead(n : pNode; var what : data);
begin
List.insterAfter(n, n^.data);
n^.data:=what;
end;
同样deleteAfter(n : pNode)
procedure List.deleteAfter(n : pNode);
var q : pNode;
begin
q := n^.next;
n^.next := n^.next^.next;
dispose(q);
end;
和delete(n : pNode)
procedure List.delete(n : pNode);
begin
if n^.next <> tail then begin
n^.data := n^.next^.data;
deleteAfter(n);
end
else begin
dispose(tail);
tail:=n;
tail^.next := nil;
end;
end;
现在当我放入迭代时,而不是评论
list.insertInstead(x,y^.data);
list.delete(y);
,它不起作用,大概是因为y^.next现在没有指向与移动之前相同的节点。
所以问题是:如何将节点移动到开头,y^.next 仍然指向同一个节点?
PS.:我已经尝试过明显的:使用和辅助变量来存储移动前y的实际值,但它似乎随着y而变化。
【问题讨论】:
-
List.delete 中似乎有错误/错误类型。在“deleteAfter(p)”行中,“p”是什么?
-
@Penguino 已编辑。但这不是问题(我正在翻译代码)
-
List.delete 中还有另一个“错字/错误”。你写“n^.data := n^.next^.next;”这不应该是“n^.data := n^.next^.data;”吗?除非您复制真实代码(或注意避免“翻译”中的错误,否则很难说出原始代码的作用。
-
@Penguino 是的,现在应该也是。现在我确定这是绝对正确的。
-
@Penguino 我还添加了指向原始代码的链接。
标签: algorithm sorting linked-list pascal quicksort