gudn tach!
deine erste vereinfachung setzt voraus, dass anfang!=ende gilt (die zweite aber nicht).
mit dieser voraussetzung (anfang!=ende) ginge es dann noch einfacher:
if(runner!=ende)
runner.get_next().set_last(runner.get_last());
else
ende=runner.get_last();
if(runner!=anfang)
runner.get_last().set_next(runner.get_next());
else
anfang=runner.get_next();
(runner!=anfang) erlaubt ja auch (runner==ende), falls (anfang!=ende).
man kann solche probleme uebrigens mit einer kleinen tabelle loesen
werte fuer | runner==ende ||
runner | (runner!=ende &&
(disjunkt) | runner!=anfang)
-----------+-----------------
anfang | 0
ende | 1
else | 1
also waere die vereinfachung des ausdrucks: (runner!=anfang)
falls auch anfang==ende gelten koennte, wuerde die tabelle etwas komplizierter:
werte fuer | runner==ende ||
runner | (runner!=ende &&
(disjunkt) | runner!=anfang)
------------------------------+-----------------
anfang (aber nicht ende) | 0
ende (und nicht anfang) | 1
anfang (==ende) | 1
else (weder anfang noch ende) | 1
und als ausdruck wuerde sich (runner!=anfang || runner==ende) ergeben.
eine andere moeglichkeit, die aber nicht jedem leichter faellt, ist das umformen:
r=runner, a=anfang, e=ende
(r==a) || ((r!=a) && (r!=e))
<=> ((r==a) || (r!=a)) && ((r==a) || (r!=e))
<=> true && ((r==a) || (r!=e))
<=> ((r==a) || (r!=e))
eigentlich fertig. falls jedoch (a!=e) vorausgesetzt wird, kann man noch einen schritt weiter umformen:
<=> (fuer a!=e) (r!=e)
auf der sicheren seite ist man also mit:
if(runner==anfang || runner!=ende)
runner.get_next().set_last(runner.get_last());
else
ende=runner.get_last();
if(runner==ende || runner!=anfang)
runner.get_last().set_next(runner.get_next());
else
anfang=runner.get_next();
prost
seth